Python保存EBCDIC字符串至文件时出现额外字符的问题
EBCDIC字符串写入文件后出现额外字节问题解决
问题描述
我尝试将EBCDIC字符串ÑkÀ*写入文件,期望保存该精确字符串,但每次保存后文件字节数变为6字节(新增2个隐藏字符),而非预期的4字节。
背景:我将数值6992645转换为十六进制6992645C,再转换为EBCDIC字符串ÑkÀ*,用于发送至IBM大型机。需要确保文件中的EBCDIC字符串可被大型机读取并转回十六进制6992645C。
我的Python代码如下:
def encode_ebcdic(input_str): # 移除COMP-3标识符和补位的0 if 'F' in input_str: input_str = input_str.replace('F', '') if '0C' in input_str: input_str = input_str.replace('0C', 'C') print("Hex:", input_str) # 将十六进制字符串转换为字节 input_bytes = bytes.fromhex(input_str) # 用EBCDIC编码解码字节为字符串 ebcdic_str = input_bytes.decode('cp037') # 返回解码后的字符串 return ebcdic_str def write_to_file(output_str): with open('output.txt', 'w') as f: # 将内容写入文件 f.write(output_str) input_string = "F69926450C"
问题原因
- 文本编码转换导致字节膨胀:用
open('output.txt', 'w')的文本模式写入时,Python默认用系统默认编码(通常是UTF-8)保存字符串。EBCDIC的Ñ和À在UTF-8中各占2字节,k和*各占1字节,总和就是6字节,这就是额外字符的来源。 - 逻辑流程错误:向IBM大型机发送数据时,不需要将EBCDIC字节解码为字符串,大型机需要的是原始二进制字节,而非经过编码转换的文本字符串。
解决方案
修改代码,直接操作EBCDIC字节,以二进制模式写入文件:
def process_ebcdic(input_str): # 移除COMP-3标识符和补位的0 if 'F' in input_str: input_str = input_str.replace('F', '') if '0C' in input_str: input_str = input_str.replace('0C', 'C') print("Hex:", input_str) # 直接返回十六进制转换后的EBCDIC字节,无需解码为字符串 return bytes.fromhex(input_str) def write_to_file(output_bytes): # 以二进制写入模式打开文件,避免编码转换 with open('output.txt', 'wb') as f: f.write(output_bytes) input_string = "F69926450C" ebcdic_bytes = process_ebcdic(input_string) write_to_file(ebcdic_bytes)
验证结果
运行修改后的代码,output.txt的字节数将是4字节,对应十六进制69 92 64 5C,也就是目标EBCDIC字符串ÑkÀ*,可被IBM大型机正确读取并转回原始十六进制值6992645C。
内容的提问来源于stack exchange,提问作者bil mason
相关产品推荐
相关产品推荐

