解压缩多个块的gzip文件

时间:2017-02-01 07:35:55

标签: gzip compression gzipstream

我有一个包含多个块的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,这样我就可以准确地知道问题所在。 我知道问题不在文件中,因为我有多个文件以相同的方式构造,并且它们显示完全相同的错误。

1 个答案:

答案 0 :(得分:0)

  

我知道问题不在文件中,因为我有多个问题   文件以相同的方式构造,它们显示完全相同的错误。

结论是问题不在文件中,而是问题在所有文件中。有人无意中或故意构造了无效的gzip文件。看起来他们在启动另一个虚假gzip流之前使用Z_SYNC_FLUSHZ_FULL_FLUSH而不是Z_FINISH来结束每个流。 gzip流以最后一个块结束,后跟一个8字节的gzip预告片,其中包含两个关于未压缩数据完整性的检查值。

然而,您可以继续进行解压缩,但是如果没有对数据进行任何完整性检查,只需在出现错误时选择decompressobj的新实例并查看新的gzip标头,{{ 1}}。

更重要的是,您应该找到并联系这些文件的来源并说出#34;嘿,WTF?"