我有一个EBCDIC平面文件要处理从一个主机到一个C模块。在将COMP和COMP-3值转换为可读值时,有什么好的过程?我是否必须将ebcdic字符转换为ascii,然后再进行COMP-3的十六进制转换?对康普来说呢?谢谢
发布于 2014-03-13 15:35:00
比尔·伍德格尔通过他对你的问题的评论给了你一些很好的建议,实际上他回答了这个问题,并且应该把他的评论作为一个答案。
我要重申他的几点,并详述其他几点。
如果您需要转换从可能是COBOL应用程序创建的文件,以便它可以被其他非COBOL程序读取,可能是在一台具有与其创建时不同的体系结构的机器上,那么您应该要求只使用显示格式的数据(即所有字符数据)来创建文件。将非显示(二进制、打包、编码)数据混合到其创建的操作环境之外只是一个长期痛苦的公式。您将享受在体系结构和代码页转换之间解决各种代码页问题的乐趣。这些都是文件传输协议设计用来管理的东西--它们做得很好,所以不要试图重新发明它们。简单回答,使用FTP或类似的文件传输机制在计算机之间移动数据。并且只有基于传输(字符)的数据。
填充的十进制(COMP-3)数据类型根据其特定的图片布局占用不同数量的字节。小数点的位置是隐含的,因此如果不参考用于定义小数点的图片,就无法确定小数点的位置。填充的十进制字段可以是签名的,也可以是无签名的。如果签名,则将该符号嵌入到最小有效数字的低4位中。打包的十进制数据类型的每个字节包含两位数,除了可能的第一个和最后一个字节。如果字段有符号,第一个字节只包含一个数字,并且包含偶数位数。最后一个字节包含2位数字(如果没有符号),但只有1位(如果有符号)。如果您想要执行自己打包的十进制到字符的转换,则需要注意其他几个微妙之处。在这一点上,我希望你们能看到,这不是一个琐碎的练习。
二进制(COMP)数据类型有一组不同但同样复杂的问题需要解决。再说一遍,这不是一项琐碎的练习。
那你该怎么做?基本上,照比尔的建议去做。让生成此文件的程序使用显示格式进行输出(这意味着您不需要做任何事情)。否则,使用一个实用程序(如DFSORT/SYNCSORT )为您执行转换。要执行实用程序路由,仍然需要有原始的COBOL文件布局(并理解它)才能进行转换。最后的办法是简单地编写一个简单的读-记录-写-记录COBOL程序,它接收未格式化的数据,MOVEes每个COMP-任何字段到相应的显示字段,然后再写出来。
正如Bill所说,如果生成此文件的组告诉您生成一个显示格式的输出文件太困难/成本太高,则他们对您撒谎,或者他们不称职,或者太懒惰,无法完成他们受雇做的工作。我想不出其他借口了。
发布于 2014-03-17 23:16:06
使用XML传输数据。
也就是说,编写一个将文件转换为字符的程序(如果在大型机上,请继续使用EBCIDIC,但数字字段是解压的,等等)。然后将每个记录和每个字段封装在XML标记中。
这避免了格式化问题(列1中的字段,列2中的字段,分隔符、空格或逗号,等等)。
然后,使用您最喜欢的实用程序将XML文件从EBCIDIC转换为ASCII。
https://stackoverflow.com/questions/22346634
复制相似问题