我有信息,一个PIC S9(4)
字段是用 comp-3 编码的。我还有一个包含数据的数据文件(在我的情况下是关于客户的)。当我使用 notepad++ 打开数据文件时,它会显示像“DLE”、“BEL”或“NUL”这样的字符,这会将我带到这个表。首先,你能告诉我,“comp-3”是做什么的吗?以及如何使用 c# 将其转换回人类可读的格式/数据(例如,将两个文件作为输入)?
4 回答
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 数字格式问题中的第二个答案给出了在进行 ascii 转换时 Comp-3 损坏的一个很好的例子。
大型机问题
如果是从大型机,你面临的问题:
- 您必须进行二进制传输
- 您必须阅读大型机文件结构(例如,FB 记录将是固定长度的记录;没有 cr/lf)。
- 您需要转换压缩十进制。
大型机选项
最好的选择是在大型机/Cobol 上进行转换并传输文本文件。
或者有像coboltocsv这样的项目,它将使用 Cobol Copybook 将 Cobol 文件转换为 Csv。
转换 comp-3
就转换 comp-3 而言,这很容易。有2种方法
将十六进制转换为十六进制字符串(即转换 x'123c' --> "123C)并检查最后一个符号字符。请参阅Java 中的 COMP-3 数据解包(嵌入在 Pentaho 中)
将领域分成一系列的 nybles
当您在普通 PIC 9(4) 字段中存储数字时,存储的值使用这些字符的十六进制代码。
例子:
1234
将被存储为F1F2F3F4
如果您将其放入一个COMP
字段中,它将被存储为00001234
这样,这意味着您将拥有以下十六进制字节 00 00 12 34。如果您想将其转换回来,您可能需要将该字段转换回来到 EBCDIC(或您在 COBOL 端使用的任何编码),并查看该字段的实际十六进制值。
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)。