在C#中将EBCDIC转换为ASCII遇问题,请求技术解答
问题分析与修正
核心错误
你的代码最关键的问题是没有正确解析十六进制字符串为EBCDIC字节数组:
- 变量
data是十六进制格式的字符串("F2F1F0..."),但你直接调用ebcdic.GetBytes(data),这会把字符串中的每个字符(比如'F'、'2')转换成对应的EBCDIC字节,而非把十六进制值解析为EBCDIC编码的字节。这导致后续转换完全偏离预期,结果自然和原字符串一致。
IBM037编码的正确性
IBM037是正确的EBCDIC编码(北美地区通用的EBCDIC编码),它的数字映射完全匹配你参考的IBM对照表:
- EBCDIC字节
0xF2对应ASCII的'2',0xF1对应'1',0xF0对应'0',以此类推,和你预期的转换结果完全契合。
修正后的代码
先将十六进制字符串解析为字节数组,再执行编码转换:
string data = "F2F1F0F2F2F5F4"; // 第一步:把十六进制字符串解析为EBCDIC字节数组 byte[] ebcdicData = new byte[data.Length / 2]; for (int i = 0; i < ebcdicData.Length; i++) { ebcdicData[i] = Convert.ToByte(data.Substring(i * 2, 2), 16); } // 第二步:执行EBCDIC到ASCII的转换 Encoding ascii = Encoding.ASCII; Encoding ebcdic = Encoding.GetEncoding("IBM037"); byte[] convertedBytes = Encoding.Convert(ebcdic, ascii, ebcdicData); string sample = ascii.GetString(convertedBytes); // 此时sample的值为"2102254",符合预期
简化写法(.NET Core 3.0+)
如果使用的是.NET Core 3.0及以上版本,可以用内置方法替代手动解析循环:
byte[] ebcdicData = Convert.FromHexString(data);
内容的提问来源于stack exchange,提问作者qhart
相关产品推荐
相关产品推荐

