format - COBOL COMP-3 数字格式问题

标签 format cobol bcd ebcdic comp-3

我有一个混合了文本和数字字段的 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 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 的 native 支持。

某个善良的灵魂为您所做的是将数据从 EBCDIC“转换”为 ASCII。否则你甚至不会识别“文本”。

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

所以:COMP-3 PIC 9(9)。正如你所说,五个字节。它是无符号的,所以最右边的 nybble 将是 F(所有位都打开)。由于符号位置被占用,即使是无符号字段,您的位置也会略微偏离。

在大型机上,它包含一个值 X'020140317F' .只有该字段的整体才能对其值(value)有意义。但是,EBCDIC 到 ASCII 的转换使其变为 X'0201209122'。

如何?

查找 X'02' 的 EBCDIC 值和 X'01' .他们不会改变。查找 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/

相关文章:

c# - .NET System.Windows.Forms DateTimePicker CustomFormat 不正确

java - SimpleDateFormat() 中的 24 小时和 java 中的毫秒

python - 从 float 转换为百分比

compiler-errors - “Not a uniquely defined name”什么时候只有一个定义?

performance - 将BCD打包到DPD : How to improve this amd64 assembly routine?

r - For循环日期不丢失日期格式

python-3.x - 在 databricks 中使用 cobrix 处理大型机文件 - Pyspark python 3

cobol - COBOL如何存储和检索数据?

java - 用Java模拟ADC指令

assembly - 压缩十进制到 ASCII 汇编