我有一个包含多个块的Gzip文件。每个块都以
开头1F 8B 08
以
结尾00 00 FF FF
我试图在linux中使用7-Zip和gzip工具解压缩文件,但我总是收到一个错误,说该文件无效。 所以我写了这个python脚本
import zlib
CHUNKSIZE=1
f=open("file.gz","rb")
buffer=f.read(CHUNKSIZE)
data=""
r=CHUNKSIZE
d = zlib.decompressobj(16+zlib.MAX_WBITS)
while buffer:
outstr = d.decompress(buffer)
print(r)
buffer=f.read(CHUNKSIZE)
r=r+CHUNKSIZE
outstr = d.flush()
我注意到它到达第二个块的标题时
00 00 00 FF FF 1F 8B 08
在FF和1F之间的点 脚本返回
zlib.error:解压缩数据时出错-3:无效块类型
我将块的大小设为1,这样我就可以准确地知道问题所在。 我知道问题不在文件中,因为我有多个文件以相同的方式构造,并且它们显示完全相同的错误。
答案 0 :(得分:0)
我知道问题不在文件中,因为我有多个问题 文件以相同的方式构造,它们显示完全相同的错误。
结论是不问题不在文件中,而是问题在所有文件中。有人无意中或故意构造了无效的gzip文件。看起来他们在启动另一个虚假gzip流之前使用Z_SYNC_FLUSH
或Z_FULL_FLUSH
而不是Z_FINISH
来结束每个流。 gzip流以最后一个块结束,后跟一个8字节的gzip预告片,其中包含两个关于未压缩数据完整性的检查值。
然而,您可以继续进行解压缩,但是如果没有对数据进行任何完整性检查,只需在出现错误时选择decompressobj
的新实例并查看新的gzip标头,{{ 1}}。
更重要的是,您应该找到并联系这些文件的来源并说出#34;嘿,WTF?"