如何在不编写 cobol 程序的情况下从 vsam 文件中确定打包 PIC cobol 子句的数值?

How to determine numeric value from vsam file for packed PIC cobol clause without writing a cobol program?

我使用了一个实用程序包 (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 的值。我的假设是否正确?

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 具有 "preferred sign" 的概念,即 C 表示正数,D 表示负数。如果您确定您的数据全部 "preferred sign."

,则可以利用优化

您对 RECORD-Y 的假设是正确的,它的值为 +11.00。

如果您正在编写 COBOL,则无需实施任何算法即可将其转换为人类可读的值,只需 MOVE RECORD-X TO RECORD-X-DISPLAY,其中 RECORD-X-DISPLAY 定义为 PIC +999.99