为何读取二进制文件首行匹配后后续行与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() # 记得关闭文件
关键优化点
- 使用
enumerate直接计数,避免手动维护dc变量,逻辑更清晰。 - 用列表
line_parts存储每行的二进制字符串,最后用" ".join()拼接,比逐个字符串相加效率更高。 - 确保每个字节都被处理,不会出现跳过的情况。
- 添加了文件关闭操作,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Raginmund_Odinson
相关产品推荐
相关产品推荐

