使用C将COMP和COMP-3 Packed Decimal转换为可读值

时间:2014-03-12 09:08:03

标签: c mainframe flat-file

我有一个EBCDIC平面文件要从大型机处理成C模块。将COMP和COMP-3值转换为可读值的好过程是什么?我是否必须将ebcdic字符转换为ascii然后将COMP-3转换为十六进制? COMP怎么样?感谢

2 个答案:

答案 0 :(得分:1)

比尔伍德通过他对你问题的评论给了你一些非常好的建议,实际上他回答了这个问题,应该有 发表评论作为答案。

我想重申他的一些观点并扩展其他几点。

如果您需要转换从可能是COBOL应用程序创建的文件,那么可以读取它 通过一些其他非COBOL程序,可能在具有与其创建的架构不同的架构的机器上,然后 您应该要求仅使用显示格式化数据(即所有字符数据)创建文件。捣碎不显示 (二进制,打包,编码)数据在创建它的操作环境之外只是一个公式 长期的痛苦。您将会遇到解决各种endianness问题的乐趣 架构和code page转换之间。这些就是那些东西 文件传输协议旨在管理 - 它们做得很好,所以不要试图重新发明它们。简短回答,使用FTP或 类似的文件传输机制在机器之间移动数据。并且只传输基于显示(字符)的数据。

压缩十进制(COMP-3)数据类型根据其特定的PICTURE布局占用不同的字节数。小数点的位置 如果没有参考用于定义它的PICTURE,则无法确定。打包的十进制字段可以是签名的 或未签名。如果签名,则符号嵌入最低有效数字的低4位。 Packed Decimal的每个字节 数据类型包含两个数字,可能除了第一个和最后一个字节。如果字段已签名,则第一个字节仅包含1位数字 并包含偶数个数字。最后一个字节包含2位数字(如果是无符号),但只有1位符号。还有其他一些细节 你需要知道你是否想要自己的Packed Decimal进行角色转换。此时我希望你能看到 这不会是一个微不足道的练习。

二进制(COMP)数据类型有一组不同但同样复杂的问题需要解决。同样,这不是一项微不足道的练习。

那你应该怎么做?基本上,就像比尔建议的那样。让生成此文件的程序使用显示格式 输出(意味着你什么都不做)。或者,如果失败,请使用DFSORT / SYNCSORT等实用程序进行转换 为了你。去实用程序 route仍然要求您具有原始COBOL文件布局(并且您理解它)才能进行转换。 最后一种方法是简单地编写一个简单的read-a-record-write-a-record COBOL程序,该程序接收未格式化的数据,MOVEes 每个COMP-whatever字段到相应的DISPLAY字段并再次写出来。

正如Bill所说,如果生成此文件的组织告诉您生成DISPLAY格式太困难/昂贵 输出文件他们骗你他们不称职只是懒得 做他们雇用的工作。我想不出别的借口。

答案 1 :(得分:0)

使用XML传输数据。

也就是说,编写一个程序将文件转换为字符(如果在大型机上,保留EBCIDIC但数字字段已解压缩等),然后将每个记录和每个字段括在XML标记中。

这可以避免格式化问题(第1列中的字段,第2列中的哪个字段,分隔符空格或逗号或其中之一等等。)

然后使用您喜欢的实用程序传输XML文件,该实用程序将EBCIDIC转换为ASCII。