5

我正在创建一个 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

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

任何帮助将不胜感激。

亲切的问候,火腿

4

5 回答 5

4

See method getMainframePackedDecimal in http://jrecord.cvs.sourceforge.net/viewvc/jrecord/jrecord/src/net/sf/JRecord/Common/Conversion.java?revision=1.2&view=markup

for an example of converting packed decimal in java (it is part of the jrecord project jrecord.sf.net)

于 2009-04-30T01:32:45.187 回答
4

这是回答您问题的一些不同尝试。

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 知道它用于舍入等。您需要以编程方式对其进行说明。该文件中没有任何内容可以帮助您确定它在哪里,或者它是否存在。

其他两个字段已经是奇数长度,因此当打包时,与符号一起,它们可以存储在偶数长度的空间中。

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

于 2009-04-28T19:32:31.240 回答
2

COMP-3 字段长度计算为我们需要存储的位数 + 1 除以 2。例如,要存储值 987 的数字字段,我们需要 3 +1 除以 2 = 2 因此 Comp-3 字段为长度 2 个字节可以存储 +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 以保留值的小数部分。

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

于 2009-07-09T06:24:09.520 回答
2

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

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

   01 2D

12.345 是:

   12 34 5C
于 2009-04-27T22:49:53.473 回答
2

开始了:

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

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

0b01110110(呃)

是“76”。

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

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

这是一篇很好的文章

于 2009-04-27T22:40:16.070 回答