首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将COMP-3压缩十进制字段解释为数值

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

Stack Overflow用户
提问于 2009-04-27 22:24:49
回答 5查看 33.5K关注 0票数 5

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

字段名称-1 PIC S9(15)V9(3)组件-3。

字段名称-2 PIC S9(3)V9(8)组件-3。

字段名称-3 PIC S9(3)V9(6) COMP-3。

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

FIELD-NAME-1: 19 FIELD-NAME-2: 11 FIELD-NAME-3: 9

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

任何帮助都将不胜感激。

亲切的问候,哈姆

EN

回答 5

Stack Overflow用户

发布于 2009-04-28 19:32:31

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

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

代码语言:javascript
复制
    00 00 00 00 00 00 00 00 00 0F

如果值为-4568248.323,则为:

代码语言:javascript
复制
    00 00 00 00 04 56 82 48 32 3D

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

代码语言:javascript
复制
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知道它在那里是为了取整之类的。您需要以编程方式对其进行说明。文件中没有任何东西可以帮助您确定它在哪里,或者它是否存在。

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

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

票数 4
EN

Stack Overflow用户

发布于 2009-04-30 01:32:45

请参见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的一部分)

票数 4
EN

Stack Overflow用户

发布于 2009-04-27 22:40:16

我们开始吧:

图片就是“图片”

S9( 15 )表示15位数字有符号字段:S表示符号,9表示数字,(15)表示长度。V是小数位9(3)是一个三位数字

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

0b01110110 (duh)

是"76“。

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

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

这是一个nice article on it

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/795523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档