LZ压缩解压后diff/cmp显示文件不同,自定义校验却判定相同
问题分析与解决思路
核心矛盾点
你遇到的情况是:自己开发的LZ压缩器,将文件压缩再解压后,diff、cmp命令检测出文件存在差异,但自定义的Python脚本却判定两个文件内容相等。这是因为你的脚本忽略了文件的字节长度和前导/尾随零字节的差异。
脚本的问题所在
你的Python代码逻辑是把文件字节转成大端整数,再转成二进制字符串对比。这个过程会丢失两个关键信息:
- 前导零字节:如果文件开头有
0x00字节,转成整数时这些前导零会被自动忽略,生成的二进制字符串也不会包含它们 - 文件总长度:比如原文件是3字节
[0x00, 0x01, 0x02],解压后变成2字节[0x01, 0x02],转成整数后是同一个值,脚本会判定相等,但实际文件字节数不同,cmp和diff会直接检测到差异
正确的文件对比方法
要准确对比两个二进制文件,直接对比原始字节数据即可,不需要转成整数或字符串。修改后的脚本如下:
with open("file.bin", "rb") as f: data1 = f.read() with open("file2.bin", "rb") as f: data2 = f.read() if data1 == data2: print('equal') else: print('diff') # 可选:定位具体差异位置 for idx, (b1, b2) in enumerate(zip(data1, data2)): if b1 != b2: print(f"差异位置:字节{idx+1},file.bin={hex(b1)},file2.bin={hex(b2)}") break else: # 走到这里说明一个文件是另一个的前缀,长度不同 print(f"文件长度不同:file.bin={len(data1)}字节,file2.bin={len(data2)}字节")
压缩器可能的问题方向
既然cmp提示第一字节就不同,用上面的脚本定位具体差异后,可以从以下方向排查:
- 压缩/解压过程中是否错误地添加或丢失了前导字节(比如自定义的文件头标识、长度字段)
- 解压时是否未正确还原原始文件的长度信息,导致输出文件长度和原文件不一致
- 二进制数据的端序处理是否有误(比如你的脚本用了大端,但压缩器内部可能用了小端处理某些字段)
内容的提问来源于stack exchange,提问作者Pedro Carvalho
相关产品推荐
相关产品推荐

