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

为何读取二进制文件首行匹配后后续行与Notepad++显示不符?

问题描述

尝试读取并打印文件的二进制数据时,发现首行(128位)与Notepad++手动查看的二进制数据匹配,但后续打印的行完全不符。以下是使用的Python代码:

nfp = open(new_file, 'rb')
dc = 0
ac = 0
short_lines = 0
line_string = str("")
for x in nfp.read():
    if dc == 16:
        ac += 1
        if ac == 5:
            break
        else:
            print(line_string)
        line_string = str("")
        dc = 0
        continue
        #open cmpf here and write
    else:
        dc += 1
        y = str("{:08b}".format(x))
        line_string = line_string + str(" ") + y


print(short_lines)
print("Final line count:", str(ac/128))
valk = input("Click any button to end program...")

预期输出为Notepad++中显示的二进制行,实际输出则与预期完全不同,请问这是什么原因?

问题原因与解决办法

核心原因

代码的计数逻辑错误,导致第17个及之后的部分字节被跳过,后续数据全部错位:

  • 初始dc=0,每处理一个字节前先让dc+1,当处理完16个字节后dc=16。
  • 下一次循环遇到第17个字节时,触发dc==16的分支,执行continue直接跳过当前字节,没有将其加入到下一行的字符串中。
  • 后续所有字节都因此错位,导致打印内容和Notepad++显示完全不符。

另外还有一个小问题:line_string每次拼接时会在开头多一个空格,不过这不会影响内容匹配,只是格式问题。

修正后的代码

调整计数逻辑,确保每个字节都被处理,同时优化字符串拼接效率:

nfp = open(new_file, 'rb')
ac = 0
short_lines = 0
line_parts = []
for idx, x in enumerate(nfp.read()):
    # 将每个字节转为8位二进制字符串,加入行列表
    line_parts.append("{:08b}".format(x))
    # 每16个字节打印一行
    if (idx + 1) % 16 == 0:
        print(" ".join(line_parts))
        line_parts = []
        ac += 1
        if ac == 5:
            break

# 处理最后一行不足16个字节的情况
if line_parts:
    print(" ".join(line_parts))
    short_lines += 1

print(short_lines)
print("Final line count:", ac)
valk = input("Click any button to end program...")
nfp.close()  # 记得关闭文件

关键优化点

  1. 使用enumerate直接计数,避免手动维护dc变量,逻辑更清晰。
  2. 用列表line_parts存储每行的二进制字符串,最后用" ".join()拼接,比逐个字符串相加效率更高。
  3. 确保每个字节都被处理,不会出现跳过的情况。
  4. 添加了文件关闭操作,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Raginmund_Odinson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:01:05