Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssis 将COMP-3压缩十进制字段解释为数值_Ssis_Cobol_Comp 3 - Fatal编程技术网

Ssis 将COMP-3压缩十进制字段解释为数值

Ssis 将COMP-3压缩十进制字段解释为数值,ssis,cobol,comp-3,Ssis,Cobol,Comp 3,我正在创建一个SSIS包,以便从一系列copybook文件中读取未打包的数据。我不确定以下字段定义的正确解释,希望有人知道: 字段名称-1 PIC S9(15)V9(3)COMP-3. 字段名称-2 PIC S9(3)V9(8)COMP-3. 字段名称-3 PIC S9(3)V9(6)COMP-3 数据存储在固定宽度的文本中。上述字段的数据具有以下长度: 字段名称-1:19 字段名称-2:11 字段名称-3:9 我不知道如何解释小数位和符号 任何帮助都将不胜感激 亲切问候,, 火腿来吧: 图片是

我正在创建一个SSIS包,以便从一系列copybook文件中读取未打包的数据。我不确定以下字段定义的正确解释,希望有人知道:

字段名称-1 PIC S9(15)V9(3)COMP-3.
字段名称-2 PIC S9(3)V9(8)COMP-3.
字段名称-3 PIC S9(3)V9(6)COMP-3

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

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

我不知道如何解释小数位和符号

任何帮助都将不胜感激

亲切问候,, 火腿

来吧:

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

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

0b01110110(duh)

是“76”

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

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


这是一个。

通常COMP-3字段由一次压缩为两个字节的数字组成,每个数字使用一个半字节(4位)。最后一个数字位于最后一个字节的上半字节。如果数字为负数,则最后一个字节的下半字节为13,如果数字为正数,则为其他数字(通常为12)。小数点是隐含的

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

   01 2D
12.345是:

   12 34 5C

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

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

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


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

请参阅中的方法getMainframePackedDecimal


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

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

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

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

如果出现上述问题,要移动数字的小数部分,需要定义一个变量,该变量只能存储小数部分,并将值移动到仅包含小数部分的字段

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

我们需要定义一个十进制字段,如DEC-party V9(6)comp-3,然后将字段名-3移动到DEC-party以保留值的小数部分

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