【问题标题】:Interpreting COMP-3 Packed Decimal Fields into numeric values将 COMP-3 压缩十进制字段解释为数值
【发布时间】:2023-04-10 02:13:01
【问题描述】:

我正在创建一个 SSIS 包,用于从一系列字帖文件中读取解压后的数据。我不确定对以下字段定义的正确解释,希望有人知道:

FIELD-NAME-1 PIC S9(15)V9(3) COMP-3.
FIELD-NAME-2 PIC S9(3)V9(8) COMP-3.
FIELD-NAME-3 PIC S9(3)V9(6) COMP-3。

数据以固定宽度的文本存储。上述字段的数据长度如下:

字段名称-1:19 字段名称 2:11 字段名 3:9

我不确定如何解释小数位和符号。

任何帮助将不胜感激。

亲切的问候, 火腿

【问题讨论】:

    标签: ssis cobol comp-3


    【解决方案1】:

    这里有一些不同的尝试来回答你的问题。

    PIC S9(15)V9(3) COMP-3 在文件中如下所示:

        00 00 00 00 00 00 00 00 00 0F
    

    如果值为-4568248.323,则为:

        00 00 00 00 04 56 82 48 32 3D
    

    这对您没有帮助,但可能对其他人有所帮助。 解压之前的值如下所示:

    F0 F0 F0 F0 F0 F0 F0 F0 F0 F4 F5 F6 F8 F2 F4 F8 F3 F2 D3 (or F3 as the last byte, therefore losing the sign)
    

    此字段在小数点前有 15 位(实际上是 16 位),在小数点后有 3 位。

    虽然它只请求 18 位数字 (15+3),但它得到 19 以使其成为带有符号的偶数长度字段(在前面添加一个数字以使其在文件中的长度为 10 个字节)。最佳实践是始终使打包字段的长度为奇数,以避免这种混淆。

    ** 最后一个字母表示符号,C & F 为正,D 为负。对于您的程序,检查是否为负 (D),如果不是,则视为正。

    ** 'V' 是隐含的小数点。它在文件中不存在,但 COBOL 知道它用于舍入等。您需要以编程方式对其进行说明。该文件中没有任何内容可以帮助您确定它在哪里,或者它是否存在。

    另外两个字段已经是奇数长度,所以当打包时,加上符号,它们可以存储在偶数长度的空间中。

    任何其他问题,编辑您的问题或在 cmets 中提问,有人会尝试为您解答。

    【讨论】:

      【解决方案2】:

      参见http://jrecord.cvs.sourceforge.net/viewvc/jrecord/jrecord/src/net/sf/JRecord/Common/Conversion.java?revision=1.2&view=markup中的getMainframePackedDecimal方法

      在 java 中转换压缩十进制的示例(它是 jrecord 项目 jrecord.sf.net 的一部分)

      【讨论】:

        【解决方案3】:

        通常 COMP-3 字段由 BCD 数字组成,一次打包成两个字节,每个数字使用一个半字节(4 位)。最后一个数字进入最后一个字节的高半字节。如果数字为负数,则最后一个字节的低半字节为 13,如果为正数,则为其他值(通常为 12)。隐含小数点。

        例如,-1.2 在十六进制中看起来像这样,最后的 D 是负号。

           01 2D
        

        12.345 是:

           12 34 5C
        

        【讨论】:

          【解决方案4】:

          我们开始吧:

          PIC 是“图片”
          S9(15) 表示 15 位数字带符号字段:S 表示符号,9 表示数字,(15) 表示长度。 V 是小数位 9(3) 是一个三位数字

          而 COMP-3 是 BCD 编码的十进制。字段的每个 nybble(半字节)都是二进制的十进制值,所以

          0b01110110(呃)

          是“76”。

          18位需要9个字节,符号是低位字节的低位。

          让我担心的是,这些应该需要 10 个字节。

          这是nice article on it。

          【讨论】:

            【解决方案5】:

            COMP-3 字段长度计算为我们需要存储的位数 + 1 除以 2。例如,要存储值 987 的数字字段,我们需要 3 +1 除以 2 = 2 因此 Comp-长度为 2 字节的 3 字段可以存储 +999 到 -999 的值作为限​​制。

            15 将存储为 01 5C。所以数字的最后四位用于存储数字的符号C或D,因此“C”代表正数,“D”代表负数。每个数字需要 4 位来表示自己。

            因此,一个 7 位数字将需要 7 +1 = 8 / 2 = 4 字节大小。因此大小为 4 字节的 comp-3 字段可以存储 +999,9999 到 -999,9999 位的数字。

            在上述问题的情况下,要移动数字的小数部分,需要定义一个只能存储小数部分的变量,并将值移动到仅包含小数部分的字段。

            类似于 FIELD-NAME-3 PIC S9(3)V9(6) COMP-3。

            我们需要定义一个像 DEC-PORTION V9(6) comp-3 这样的十进制字段,然后将 FIELD-NAME-3 移动到 DEC-PORTION 以保留值的小数部分。

            这样我们可以将数字的小数部分与完整的数字分开。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-01-22
              • 1970-01-01
              • 2010-09-13
              • 1970-01-01
              • 1970-01-01
              • 2019-05-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多