如何在Python中解压无ZIP头的原始PKZIP数据?
处理损坏PKZIP文件的Python方案
直接用Python标准库中的zlib包就能满足你的需求,它原生支持ZIP中使用的deflated(0x0008)压缩格式,完全可以跳过损坏的ZIP头,仅处理压缩数据缓冲区。
核心逻辑
ZIP里的deflated压缩本质就是原始的deflate数据流,zlib可以直接处理这种数据流,无需依赖完整的ZIP结构,也能跳过CRC校验。
实现代码
import zlib # 读取损坏的目标文件 with open("corrupted_file.bin", "rb") as f: full_data = f.read() # 跳过前面的ZIP头部分(按你给出的10项字段,总长度为46字节) compressed_data = full_data[46:] # 初始化解压对象:-zlib.MAX_WBITS表示处理原始deflate数据流(无zlib头/校验) decompressor = zlib.decompressobj(-zlib.MAX_WBITS) # 执行解压 uncompressed_data = decompressor.decompress(compressed_data) # 处理剩余的缓冲数据 uncompressed_data += decompressor.flush() # uncompressed_data即为最终的原始数据
关键说明
- 参数
-zlib.MAX_WBITS是核心:它告诉zlib要处理的是原始deflate数据流(不带zlib的头部标识和尾部校验),这和ZIP规范中使用的deflate格式完全匹配。 - 该方法完全忽略ZIP头、文件名、CRC校验以及损坏的结束记录,只专注于压缩数据的解压,和你手动修复后用7zip解压的效果一致。
内容的提问来源于stack exchange,提问作者PanJanek
相关产品推荐
相关产品推荐

