我使用了一个实用程序包(vsmr)来读取VSAM文件的值,并且我可以使用copybook源代码。
如果我有如下定义(请原谅格式化)
01 RECORD
05 RECORD-X PIC S9(3)V99 COMP-3
05 RECORD-Y PIC S9(3)V99 COMP-3
05 RECORD-Z PIC S9(3) COMP-3
05 RECORD-ALPHA PIC X(10)
我在数据中有以下内容
00 20 0C 01 10 0C 01 00 0C
如何确定RECORD-X的数值?
我假设RECORD-X占用3个字节,值00 20 0C对应于RECORD-X的值,但我不知道如何将其转换为人类可读的值(在算法上,不一定以编程方式)。
我还假设值01 10 0C对应于RECORD-Y的值。我的假设是否正确?
答案 0 :(得分:4)
COMP-3是二进制编码十进制(BCD)的实现。一个字节中的每个半字节对应一个数字,最后一个半字节持有符号。你在哪里......
00 20 0C 01 10 0C 01 00 0C
...我们可以将前三个字节映射到RECORD-X
,其值为+002.00。具有值C,A,F或E的符号半字节在算术上被认为是正的;具有B或D值的符号半字节在算术上被认为是负的。小数点未在数据中编码,您必须具有字段定义才能知道它的位置。
IBM Enterprise COBOL的概念是"首选标志"其中C表示正数,D表示负数。如果您确定您的数据是全部"首选标志,则可以利用优化。"
您对RECORD-Y
的假设是正确的,其值为+11.00。
如果您正在编写COBOL,则无需实现任何算法将其转换为人类可读的值,只需MOVE RECORD-X TO RECORD-X-DISPLAY
RECORD-X-DISPLAY
定义PIC +999.99
。