我有一个cobol“磁带格式”转储,其中包含文本字段和数字字段。我正在读取C#中作为二进制数组(字节数组)的文件。我有复制书,并且格式在文本字段上排列整齐。也有许多COMP-3字段。这些字段中的数据似乎与任何BCD格式都不匹配。我知道数据应该是什么,我有COMP-3的原始字节。我首先尝试转换为EBCDIC,但没有得到更好的结果。关于如何在内部存储COMP-3号的任何想法?以下是PIC的三个示例,原始数据和预期数量。我知道字段位置正确,因为数字的两边都有alpha数据,并且所有行都正确排列。

第一个例子:
领域的PIC是9(9)COMP-3
数据有5个字节,十六进制值为02 01 20 91 22
结果数据应为日期(00CCYYMMDD)。该特定日期应为3-17-14。

第二个例子:
领域的PIC是S9(3)COMP-3
数据有2个字节,十六进制值为0A 14
结果值应介于900到999之间
我的理解是,“ S”表示最后的半字节应为0xC或0xD,以表示+或-

第三个例子:
领域的PIC是S9(15)V99 COMP-3
数据有9个字节,十六进制值为00 00 00 00 00 00 00 01 80 0C
结果值应为12.00

好的,谢谢那些向我指出正确方向的人。这确实是ASCII / EBCDIC表示问题。 BCD存储在EBCDIC中。使用ASCII到EBCDIC转换表可以产生格式正确的BCD数字:

我使用此链接来映射数据:http://shop.alterlinks.com/ascii-table/ascii-ebcdic-us.php

我的数据:0A 14转换后:25 3C(原来253是有效值,规格错误)C = +,一切都很好

我的数据:01 80 0C(不包括前导零)转换后:01 20 0C 12.00 C = +,隐含2位数字格式,都很好

我的数据:02 01 20 91 22转换为:02 01 40 31 7F 2014/03/17(F未使用,半字节),都很好

最佳答案

尽管该短语对于提供数据的人可能有某些意义,但没有COBOL "tape format"这样的东西。

问题的线索是您可以阅读文本。将其连接到EBCDIC标签,并连接到C#。

因此,您正在读取的数据最初是从大型机(最有可能是IBM大型机)获取的,该数据使用EBCDIC而不是ASCII。

COBOL没有对BCD的本机支持。

某种灵魂为您完成的工作就是将数据从EBCDIC转换为ASCII。否则,您甚至都不会识别“文本”。

不幸的是,对于任何二进制或十进制十进制或浮点字段(您不会看到很多,但它们是COMP-1 / COMP-2),这意味着“转换”意味着“可能被加扰”,因为覆盖是假设单个字节使用简单的字节值,而所有这些字段都是通过多个字节或非EBCDIC值或两者进行常规编码。

因此:COMP-3 PIC 9(9)。如您所说,五个字节。它是无符号的,因此最右边的半字节将是F(所有位都在)。由于符号位置被占用,因此您的位置略有不足,即使对于未签名的字段也是如此。

在大型机上,它包含一个值X'020140317F'。只有整个领域才能对其价值产生任何意义。但是,EBCDIC到ASCII的转换已使其变为X'0201209122'。

怎么样?

查找X'02'X'01'的EBCDIC值。他们没有改变。查找X'40'的值,哎呀,这是一个空格,将其更改为ASCII X'20'。查找X'31'的值。实际上那里没有什么特别的,它已经转换为比X'7F'高的东西,但是如果您查看使用的翻译表,我想您会明白为什么会发生这种情况。 X'7F'是双引号,因此将其更改为X'22'

您显示的其他值也遇到相同的问题。

您只能以纯字符格式从大型机中获取数据。这里有很多答案,您应该看一下右边的related

看看这个最近的问题:Convert COMP and COMP-3 Packed Decimal into readable value with C

关于format - COBOL COMP-3数字格式问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22812755/

10-14 19:28