当前位置: 首页 > 知识库问答 >
问题:

在.NET中解包Comp-3时遇到困难。在Comp-3值中除了符号字符外还有字母字符

蒋奕
2023-03-14

此文件来自我们的一个客户,我有以下字段的复印本布局:

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++禁止将字符串常量转换为字符*。我如何修复这个错误?