【发布时间】:2017-06-07 21:38:24
【问题描述】:
我知道PIC S9(4) 字段是用comp-3 编码的。我还有一个包含数据的数据文件(在我的情况下是关于客户的)。当我使用记事本++ 打开数据文件时,它会显示像“DLE”、“BEL”或“NUL”这样的字符,这导致我看到了这个table。
首先,你能告诉我,“comp-3”是做什么的吗?以及如何使用 c# 将其转换回人类可读的格式/数据(将两个文件作为输入)?
【问题讨论】:
我知道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 通常是二进制格式,所以1234 将是x4D2;对于COMP-3 又名PACKED-DECIMAL,您的示例缺少符号半字节,应为x01234C。
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 损坏的一个很好的例子。
如果是来自大型机,你面临的问题:
最好的选择是在大型机/Cobol 上进行转换并传输文本文件。
或者有像 coboltocsv 这样的项目,它会使用 Cobol Copybook 将 Cobol 文件转换为 Csv。
就转换 comp-3 而言,这很容易。有两种方法
将十六进制转换为十六进制字符串(即转换 x'123c' --> "123C)并检查最后一个符号字符。参见COMP-3 data unpacking in Java (Embedded in Pentaho)
将领域分成一系列的 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倍。
关于你的第二个问题。将字符串分解成位。除最后 4 位外,每 4 位补偿 0000 将为您提供人类可读的结果。最后 4 位,取决于它是 C 还是 D,是 + 或 - 号。
【讨论】:
如果您知道该值不是十进制,请尝试将其移至 PIC 9(9)。
【讨论】: