Python读取字节时换行符0x0a被解析为0xd0问题求助
问题原因及修复方案
核心错误点
- 十六进制字符串生成错误:手动补0的方向搞反了,导致0x0a被错误生成为
a0而非0a。后续处理时,a0被解析为160(0xA0),对应UTF-8字符(不间断空格),再加上循环逻辑错误引发的额外字节,最终显示为d0 a0。 - 循环逻辑顺序颠倒:先判断是否要处理buffer,再添加当前字节的十六进制,导致第一个块处理空内容,最后一个字节的十六进制未被纳入处理流程。
- buffer处理逻辑混乱:将转换后的字符直接追加到原十六进制buffer中,破坏了buffer的结构,引发后续解析错误。
修复后的代码
with open(path, "rb") as root: b_arr = root.read() print("Processing...") buffer = "" b_arr_wizard = "" for i in range(len(b_arr)): # 先将当前字节转为两位十六进制字符串加入buffer buffer += f"{b_arr[i]:02x} " # 判断是否需要处理当前buffer:每16字节或最后一个字节 if (i + 1) % 16 == 0 or i == len(b_arr) - 1: # 补空格对齐到16字节的长度(16*3=48字符) hex_part = buffer.ljust(48) # 生成字符显示部分 chars_part = "" for hex_str in buffer.split(): byte_val = int(hex_str, 16) if 32 <= byte_val <= 126: chars_part += chr(byte_val) else: chars_part += "." # 拼接十六进制部分和字符部分 b_arr_wizard += f"{hex_part}| {chars_part}\n" # 清空buffer准备下一块 buffer = "" # 输出结果 print(b_arr_wizard)
修复说明
- 用
f"{b_arr[i]:02x} "替代手动拼接,直接生成正确的两位十六进制字符串,避免补0方向错误。 - 调整循环顺序:先添加当前字节的十六进制,再判断是否处理buffer,确保所有字节都被纳入处理。
- 分离十六进制部分和字符部分:单独生成
chars_part,不修改原buffer,避免结构混乱。 - 移除多余的
b" "追加,原文件内容无需额外添加空格。
测试原文件abc\ndef时,修复后的代码会输出:
61 62 63 0a 64 65 66 | abc.def
内容的提问来源于stack exchange,提问作者soda
相关产品推荐
相关产品推荐

