此文件来自我们的一个客户,我有以下字段的复印本布局:
05 EH-GROSS-INVOICE-AMT PIC S9(07)V9999 COMP-3.
05 EH-CASH-DISCOUNT-AMT PIC S9(07)V9999 COMP-3.
05 EH-CASH-DISCOUNT-PCT PIC S9(03)V9999 COMP-3.
我将只关注这3个字段,因为所有其他字段都是PIC(X)并且已经是Unicode值。我在Max Vagner创建的工具Ebcdic2Ascii的帮助下加载了所有内容。我只是对“解包”功能做了一点修改,并将其修改为
private string Unpack(byte[] packedBytes, int decimalPlaces, out bool isParsedSuccessfully)
{
isParsedSuccessfully = true;
return BitConverter.ToString(packedBytes);
}
为了让我获得以下示例数据:
EH-GROSS-INVOICE-AMT EH-CASH-DISCOUNT-AMT EH-CASH-DISCOUNT-PCT
----------------------------------------------------------------------
00-1A-1A-03-26-0C 00-00-00-00-00-0C 00-00-00-0C
00-0A-1A-1A-00-0C 00-00-1A-1A-2D-0C 00-1A-00-0C
00-09-10-20-00-0C 00-00-10-1A-1A-0C 00-1A-00-0C
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var result1 = UnpackMod("00-1A-1A-03-26-0C", 4);
var result2 = UnpackMod("00-00-00-00-00-0C", 4);
var result3 = UnpackMod("00-00-00-0C", 4);
Console.WriteLine($"{result1}\n{result2}\n{result3}\n");
var result4 = UnpackMod("00-0A-1A-1A-00-0C", 4);
var result5 = UnpackMod("00-00-1A-1A-2D-0C", 4);
var result6 = UnpackMod("00-1A-00-0C", 4);
Console.WriteLine($"{result4}\n{result5}\n{result6}\n");
var result7 = UnpackMod("00-09-10-20-00-0C", 4);
var result8 = UnpackMod("00-00-10-1A-1A-0C", 4);
var result9 = UnpackMod("00-1A-00-0C", 4);
Console.WriteLine($"{result7}\n{result8}\n{result9}");
Console.ReadLine();
}
/// <summary>
/// Method for unpacking Comp-3 fields.
/// </summary>
/// <param name="hexString"></param>
/// <param name="decimalPlaces"></param>
/// <returns>Returns numeric string if parse was successful; else Return input hex string</returns>
private static string UnpackMod(string inputString, int decimalPlaces)
{
var outputString = inputString;
// Remove "-".
outputString = outputString.Replace("-", "");
// Check last character for sign.
string lastChar = outputString.Substring(outputString.Length - 1, 1);
bool isNegative = (lastChar == "D" || lastChar == "B");
// Remove sign character.
if (lastChar == "C" || lastChar == "A" || lastChar == "E" || lastChar == "F" || lastChar == "D" || lastChar == "B")
{
outputString = outputString.Substring(0, outputString.Length - 1);
}
// Place decimal point.
outputString = outputString.Insert(outputString.Length - decimalPlaces, ".");
// Check if parsed value is numeric. This will also eliminate all leading 0.
var isParsedSuccessfully = decimal.TryParse(outputString, out decimal decimalValue);
// If isParsedSuccessfully is true then return numeric string else return inputString..
string result = "NULL";
if (isParsedSuccessfully)
{
// Convert value to negative.
if (isNegative)
{
decimalValue = decimalValue * -1;
}
result = decimalValue.ToString();
}
return result;
}
}
}
EH-GROSS-INVOICE-AMT EH-CASH-DISCOUNT-AMT EH-CASH-DISCOUNT-PCT
----------------------------------------------------------------------
NULL 0.0000 0.0000
NULL NULL NULL
9102.0000 NULL NULL
正如您所看到的,我只能正确地得到以下3个值:
00-09-10-20-00-0C -> 9102.0000
00-00-00-00-00-0C -> 0.0000
00-00-00-0C -> 0.0000
参考来源:http://www.3480-3590-data-conversion.com/article-packed-fields.html。我对COMP-3有以下理解:
COBOL Comp-3是一种二进制字段类型,它使用一种称为二进制编码十进制或BCD的符号,将(“打包”)两位数字段放入每个字节。
00-1A-1A-03-26-0C
00-0A-1A-1A-00-0C
00-00-1A-1A-2D-0C
00-1A-00-0C
00-00-10-1A-1A-0C
00-1A-00-0C
这些值在符号字符之外还有其他字符。我有一种感觉,数据已经被转换了,因为如果没有,那么应该没有可读的值,除非您应用编码。我仍然不确定这一点,并希望对此有任何见解。谢了。
我已经使用了解包数据逻辑提供在下面的链接为java如何解包COMP-3数字使用java?但是对于源中的空数据,它返回404040404,就像Java解包代码一样。我明白这是ebcdic中的空间,但如何通过处理这个空间来解包或避免它。
我有一个巨大的大型机文件,在那个文件中有一些打包的数字。我想知道如何使用Java解包以下数字? 有人能告诉我的程序是否正确吗?
我试图使用ANTLR创建一种语言,其中每一行都由一个指令组成,其中一个指令是一个操作码和任意数量的操作数,如下所示: 我有字符串似乎工作正常,但整数似乎解析不正确。 这是我完整的语法文件: 我尝试了多个不同的INT定义,如和使输入中的所有INT都出现错误,总是导致类似于的错误,而行号、列和整数被替换为正在解析的任何整数。 我对ANTLR是全新的,不熟悉很多术语,所以请让我保持简单。
问题内容: 删除字符串的前三个字符的最有效方法是什么? 例如: 问题答案: 只需使用子字符串:将返回
转换后,我得到的解压缩数据为
下面的代码是我的程序的一部分。它不执行,它说C++禁止将字符串常量转换为字符*。我如何修复这个错误?