0

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

4

4 回答 4

5

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 损坏的一个很好的例子。

大型机问题

如果是从大型机,你面临的问题:

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

大型机选项

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

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


转换 comp-3

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

  1. 将十六进制转换为十六进制字符串(即转换 x'123c' --> "123C)并检查最后一个符号字符。请参阅Java 中的 COMP-3 数据解包(嵌入在 Pentaho 中)

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

于 2017-01-23T22:38:15.277 回答
0

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

例子:

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

于 2017-01-23T16:18:16.657 回答
0

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,是 + 或 - 符号。

于 2017-01-25T14:47:12.710 回答
0

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

于 2017-01-25T14:58:37.980 回答