解压包含多个块的 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_FLUSH
或 Z_FULL_FLUSH
而不是 Z_FINISH
在开始另一个伪 gzip 流之前结束每个流来做到这一点的。 gzip 流以最后一个块结束,后跟一个 eight-byte gzip 尾部,其中包含两个关于未压缩数据完整性的检查值。
尽管没有对数据进行任何完整性检查,但您仍然可以继续解压,只需在遇到错误并看到新的 gzip header, 1f 8b 08
.
更重要的是,您应该找到并联系这些文件的来源,然后说 "Hey, WTF?"
我有一个 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_FLUSH
或 Z_FULL_FLUSH
而不是 Z_FINISH
在开始另一个伪 gzip 流之前结束每个流来做到这一点的。 gzip 流以最后一个块结束,后跟一个 eight-byte gzip 尾部,其中包含两个关于未压缩数据完整性的检查值。
尽管没有对数据进行任何完整性检查,但您仍然可以继续解压,只需在遇到错误并看到新的 gzip header, 1f 8b 08
.
更重要的是,您应该找到并联系这些文件的来源,然后说 "Hey, WTF?"