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



我有信息,PIC S9(4)字段是用comp-3编码的。我还有一个数据文件,其中包含数据(在我的案例中是关于客户的)。当我使用notepad++打开数据文件时,它会显示"DLE"、"BEL"或"NUL"等字符,这将引导我进入此表。首先,你能解释一下"comp-3"是干什么的吗?我如何使用c#(将两个文件都作为输入)将其转换回人类可读的格式/数据?

Comp-3格式

Comp-3格式

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

存在许多问题https://stackoverflow.com/search?q=%22comp-3%22+钴醇

如果这是一个大型机文件,并且已转换为ASCII;它将无法使用!!!。COBOL COMP-3数字格式问题的第二个答案给出了一个很好的例子,说明在进行ascii转换时COMP-3损坏。

大型机问题

如果它来自大型机,您面临的问题:

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

大型机选项

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

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


转换comp-3

就转换comp-3而言,这已经足够容易了。有两种方法

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

  2. 将字段分解为一系列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模拟器,我也不知道记事本++,我认为ultraedit可以向你展示文件的十六进制格式。附言:我建议你用COMP代替COMP-3。COMP是二进制模式,其计算效率是COMP-3的3倍。

关于你的第二个问题。把绳子掰成小块。将0000补偿到除最后4位之外的每4位,将得到人类可读的结果。最后4位,取决于它的C或D,是+或-号

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

最新更新