You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python读取字节时换行符0x0a被解析为0xd0问题求助

问题原因及修复方案

核心错误点

  1. 十六进制字符串生成错误:手动补0的方向搞反了,导致0x0a被错误生成为a0而非0a。后续处理时,a0被解析为160(0xA0),对应UTF-8字符 (不间断空格),再加上循环逻辑错误引发的额外字节,最终显示为d0 a0。
  2. 循环逻辑顺序颠倒:先判断是否要处理buffer,再添加当前字节的十六进制,导致第一个块处理空内容,最后一个字节的十六进制未被纳入处理流程。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:28:11