我正在创建一个SSIS包来读取一系列copybook文件中的解压缩数据。我不确定对以下字段定义的正确解释,并希望有人知道:
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。
数据以固定宽度的文本存储。上述字段的数据具有以下长度:
FIELD-NAME-1:19 FIELD-NAME-2:11 FIELD-NAME-3:9
我不确定如何解释小数位和符号。
非常感谢任何帮助。
亲切的问候, 火腿
答案 0 :(得分: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知道它在那里用于舍入等。您需要以编程方式对其进行说明。文件中没有任何内容可以帮助您确定它的位置或是否存在。
另外两个字段已经是奇数长度,所以当打包时,带有符号,它们可以存储在一个偶数长度的空间中。
任何其他问题,编辑您的问题或在评论中询问,有人会尝试为您回答。
答案 1 :(得分:4)
在java中转换压缩十进制的示例(它是jrecord项目jrecord.sf.net的一部分)
答案 2 :(得分:2)
我们走了:
PIC是“图片”和COMP-3是BCD编码的十进制数。字段的每个nybble(半字节)都是二进制的十进制值,所以
0b01110110(duh)
是“76”。
18位需要9个字节,符号是低位字节的低位数。
令我担心的是,那些应该需要 10 字节。
答案 3 :(得分:2)
COMP-3字段通常由BCD个数字组成,每次两个字节,每个数字使用半字节(4位)。最后一个数字位于最后一个字节的高半字节中。如果数字为负数,则最后一个字节的低半字节为13,如果为正,则为其他内容(通常为12)。小数点是隐含的。
例如,-1.2在十六进制中看起来像这样,最后的D是负号。
01 2D
12.345是:
12 34 5C
答案 4 :(得分: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以保留值的小数部分。
这样我们可以将数字的小数部分与完整数字分开。