【问题标题】:Decompress gzip file that contine multiple blocks解压缩包含多个块的 gzip 文件
【发布时间】:2017-02-01 07:35:54
【问题描述】:

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

【问题讨论】:

    标签: gzip compression gzipstream


    【解决方案1】:

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

    结论是不是问题不在文件中,而是问题在所有文件中。有人无意或故意构建了无效的 gzip 文件。看起来他们这样做是通过使用Z_SYNC_FLUSHZ_FULL_FLUSH 而不是Z_FINISH 来结束每个流,然后再开始另一个假gzip 流。 gzip 流以最后一个块结束,后跟一个 8 字节的 gzip 预告片,其中包含两个未压缩数据完整性检查值。

    您仍然可以继续解压缩,但无需对数据进行任何完整性检查,只需在出现错误并看到新的 gzip 标头1f 8b 08 时使用decompressobj 的新实例即可。

    更重要的是,您应该找到并联系这些文件的来源并说“嘿,WTF?”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2017-02-01
      • 2012-12-02
      • 2012-08-22
      • 1970-01-01
      相关资源
      最近更新 更多