将 comp-3 转换回人类可读的格式

Converting comp-3 back to a human readable format

我知道 PIC S9(4) 字段是用 comp-3 编码的。我还有一个包含数据的数据文件(在我的例子中是关于客户的)。当我使用记事本++打开数据文件时,它显示了 "DLE"、"BEL" 或 "NUL" 之类的字符,这让我看到了 table。 首先,你能向我解释一下 "comp-3" 的作用吗?以及如何使用 C# 将其转换回人类可读的格式/数据(将两个文件作为输入)?

当您在普通 PIC 9(4) 字段中存储数字时,存储的值使用这些字符的十六进制代码。

示例:

1234 将存储为 F1F2F3F4 如果您将其放入 COMP 字段中,它将存储为 00001234,这意味着您将拥有在十六进制字节 00 00 12 34 之后。如果你想将它转换回来,你可能需要将该字段转换回 EBCDIC(或者你在 COBOL 端使用的任何编码),并查看它的实际十六进制值场.

Comp-3 格式

Comp-3 格式

value     comp-3 (hex)
 123        x'123c'
-123        x'123d'

存在的问题很多https://whosebug.com/search?q=%22comp-3%22+cobol

如果这是一个大型机文件并且已经转换为ASCII;它 不会 use-able !!!。 COBOL COMP-3 number format issue 中的第二个答案给出了在进行 ascii 转换时 Comp-3 损坏的一个很好的例子。

大型机问题

如果是来自主机,你面临的问题:

  1. 您必须进行二进制传输
  2. 您必须阅读大型机文件结构(例如 FB 记录将是固定长度的记录;否 cr/lf)。
  3. 您需要转换压缩十进制。

大型机选项

最好的选择是在主机/Cobol 上进行转换并传输一个文本文件。

或者还有像 coboltocsv 这样的项目,它们将使用 Cobol Copybook 将 Cobol 文件转换为 Csv。


正在转换 comp-3

就转换 comp-3 而言,这很容易。有两种方法

  1. 将十六进制转换为 Hex-String(即转换 x'123c' --> "123C)并检查最后一个符号字符。参见 COMP-3 data unpacking in Java (Embedded in Pentaho)

  2. 将字段分成一系列的 nybles

Comp-3 是一种压缩格式。 S9(4) comp-3 占用3个字节。 +1234 将以十六进制格式存储为 x'01234C'。而 -1234 将存储为 x'01234D'。如您所见,在这种情况下,第一个字节的前 4 位始终为 0,所以基本上您浪费了 1 个数字。 S9(5) 和 S9(4) 占用相同的字节。 显然你并没有真正使用 3270 模拟器,我不知道 notepad++,我认为 ultraedit 可以向你显示文件的十六进制格式。 PS:我建议您使用 COMP 而不是 COMP-3。 COMP是二进制模式,计算效率是COMP-3的3倍

关于你的第二个问题。将字符串分解成位。将 0000 补偿到每 4 位,除了最后 4 位会给你 human-readable 结果。最后4位,取决于它是C还是D,是+或-号。

如果您知道该值不是十进制,请尝试将其移动到 PIC 9(9)。