用C#编码带有压缩小数的EBCDIC文件

8

我需要为一个外部实体准备一个文件,这个实体使用 IBM 主机和 COBOL,并要求文件以 EBCDIC 编码。我使用 C# 创建该文件。我想这是一个两部分的问题...首先,下面的代码是否足够确保生成的文件能够被他们读取?

StreamWriter sw = new StreamWriter(@"C:\EBCDICFileEquivalent.txt", false, Encoding.GetEncoding(37));

其次,文件中的几个字段需要使用压缩十进制表示,格式为 S(9)13 COMP-3。由于我已经指定了 EBCDIC 编码,那么我是否可以直接使用十进制数(例如 1234500000001)将其写入文件中:

sw.WriteLine("1234500000001C"); 

如何在生成的文件中正确显示编码?

我从未接触过EBCDIC或COMP-3。

2个回答

2

那段代码应该能成功地创建一个EBCDIC文件。这通常是不必要的,因为FTP过程通常会自动将文件从ASCII转换为EBCDIC,但如果不是这种情况,那么您创建的文件应该是正确的,并且可以作为二进制文件而不是文本传输。

按照主机区域有符号十进制格式将数字写成文本并进行适当的替换是正确的做法。当然,这些替换很麻烦,但像您现在这样将它们写成字符串的方式是让主机能够读取的正确方法。


1
FTP部分非常重要。如果您自己进行ASCII到EBCDIC转换,则必须确保使用二进制模式传输,否则您将面临双重转换文件的风险。 - Chris Haas
是的,你应该在第一次尝试时创建一个ASCII文件,让系统进行转换。只有在这种方法不起作用时,你才应该尝试制作EBCDIC文件。 - Jeffrey L Whitledge
@dan04 - 我的答案并没有错。OP指定了EBCDIC和COMP-3,这两种格式是不兼容的。我的答案对于EBCDIC中的区域十进制数是正确的。我相信你的答案对于COMP-3是正确的(我没有经验)。我们哪个答案适用取决于实际要求,这从问题中并不清楚。 - Jeffrey L Whitledge

1
其次,文件中的几个字段需要使用紧缩十进制格式S(9)13 COMP-3。由于我已经指定了EBCDIC编码,我可以直接使用以下方式将十进制数(例如1234500000001)写入文件吗?
sw.WriteLine("1234500000001C");
不行。这个语句会写入EBCDIC字节:
F1 F2 F3 F4 F5 F0 F0 F0 F0 F0 F0 F0 F1 C3
但是这个字段是COMP-3格式。这不是编码字符;它是带有符号半字节的BCD码(C=正数,D=负数,F=无符号)。
12 34 50 00 00 00 1C
假设代码页37是正确的,您可以使用字符串"\u0012\u0094&\u0000\u0000\u001C"将其写入文件,但更明智的做法是以二进制模式写入这些非文本字段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接