【问题标题】:Converting comp-3 back to a human readable format将 comp-3 转换回人类可读的格式
【发布时间】:2017-06-07 21:38:24
【问题描述】:

我知道PIC S9(4) 字段是用comp-3 编码的。我还有一个包含数据的数据文件(在我的情况下是关于客户的)。当我使用记事本++ 打开数据文件时,它会显示像“DLE”、“BEL”或“NUL”这样的字符,这导致我看到了这个table。 首先,你能告诉我,“comp-3”是做什么的吗?以及如何使用 c# 将其转换回人类可读的格式/数据(将两个文件作为输入)?

【问题讨论】:

标签: c# cobol comp-3


【解决方案1】:

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

示例:

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

【讨论】:

  • 1.) COMP 通常是二进制格式,所以1234 将是x4D2;对于COMP-3 又名PACKED-DECIMAL,您的示例缺少符号半字节,应为x01234C
【解决方案2】:

Comp-3 格式

Comp-3 格式

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

还有很多问题https://stackoverflow.com/search?q=%22comp-3%22+cobol

如果这是一个大型机文件并已转换为 ASCII;它将无法使用 !!!。 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. 将十六进制转换为十六进制字符串(即转换 x'123c' --> "123C)并检查最后一个符号字符。参见COMP-3 data unpacking in Java (Embedded in Pentaho)

  2. 将领域分成一系列的 nybles

【讨论】:

    【解决方案3】:

    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倍。

    关于你的第二个问题。将字符串分解成位。除最后 4 位外,每 4 位补偿 0000 将为您提供人类可读的结果。最后 4 位,取决于它是 C 还是 D,是 + 或 - 号。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2021-06-21
        • 2010-12-11
        • 1970-01-01
        • 2018-04-22
        相关资源
        最近更新 更多