解压包含多个块的 gzip 文件

Decompress gzip file that contine multiple blocks

我有一个 Gzip 文件,其中有多个 blocks.Every 块以

开头
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之间 脚本 return

zlib.error: Error -3 while decompressing data: invalid block type

我将块的大小设置为 1,这样我就可以确切地知道问题出在哪里。 我知道问题不在文件中,因为我有多个文件以相同的方式构建并且它们显示完全相同的错误。

I know that the problem is not in the file because I have multiple files constructed the same way and they show exactly the same error.

结论是不是问题不在文件中,而是问题在您的所有文件中。有人无意或故意构建了无效的 gzip 文件。看起来他们是通过使用 Z_SYNC_FLUSHZ_FULL_FLUSH 而不是 Z_FINISH 在开始另一个伪 gzip 流之前结束每个流来做到这一点的。 gzip 流以最后一个块结束,后跟一个 eight-byte gzip 尾部,其中包含两个关于未压缩数据完整性的检查值。

尽管没有对数据进行任何完整性检查,但您仍然可以继续解压,只需在遇到错误并看到新的 gzip header, 1f 8b 08.

更重要的是,您应该找到并联系这些文件的来源,然后说 "Hey, WTF?"