当前位置: 首页 > 面试题库 >

zlib.error:解压缩时出错-3:不正确的标头检查

傅长恨
2023-03-14
问题内容

我有一个gzip文件,我正尝试通过Python读取它,如下所示:

import zlib

do = zlib.decompressobj(16+zlib.MAX_WBITS)
fh = open('abc.gz', 'rb')
cdata = fh.read()
fh.close()
data = do.decompress(cdata)

它抛出此错误:

zlib.error: Error -3 while decompressing: incorrect header check

我该如何克服?


问题答案:

更新:dnozay的答案解释了该问题,应该是公认的答案。

您有此错误:

zlib.error: Error -3 while decompressing: incorrect header check

这很可能是因为您试图检查不存在的标头,例如您的数据遵循RFC 1951deflate压缩格式)而不是RFC 1950(zlib压缩格式)或RFC 1952(gzip压缩格式)。

选择windowBits

但是zlib可以解压缩所有这些格式:

  • (解压缩)deflate格式,使用wbits = -zlib.MAX_WBITS
  • (解压缩)zlib格式,使用wbits = zlib.MAX_WBITS
  • (解压缩)gzip格式,使用wbits = zlib.MAX_WBITS | 16

请参阅http://www.zlib.net/manual.html#Advanced(部分inflateInit2)中的文档

例子

测试数据:

>>> deflate_compress = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS)
>>> zlib_compress = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS)
>>> gzip_compress = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16)
>>> 
>>> text = '''test'''
>>> deflate_data = deflate_compress.compress(text) + deflate_compress.flush()
>>> zlib_data = zlib_compress.compress(text) + zlib_compress.flush()
>>> gzip_data = gzip_compress.compress(text) + gzip_compress.flush()
>>> 

明显的测试zlib

>>> zlib.decompress(zlib_data)
'test'

测试deflate

>>> zlib.decompress(deflate_data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check
>>> zlib.decompress(deflate_data, -zlib.MAX_WBITS)
'test'

测试gzip

>>> zlib.decompress(gzip_data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check
>>> zlib.decompress(gzip_data, zlib.MAX_WBITS|16)
'test'

数据还与gzip模块兼容:

>>> import gzip
>>> import StringIO
>>> fio = StringIO.StringIO(gzip_data)  # io.BytesIO for Python 3
>>> f = gzip.GzipFile(fileobj=fio)
>>> f.read()
'test'
>>> f.close()

自动标头检测(zlib或gzip)

加入32windowBits将触发标题检测

>>> zlib.decompress(gzip_data, zlib.MAX_WBITS|32)
'test'
>>> zlib.decompress(zlib_data, zlib.MAX_WBITS|32)
'test'

使用gzip代替或者您可以忽略zlibgzip直接使用模块;但请记住,在引擎盖下,gzip使用zlib

fh = gzip.open('abc.gz', 'rb')
cdata = fh.read()
fh.close()

试试这个gzip模块,下面的代码直接来自python
docs

import gzip
f = gzip.open('/home/joe/file.txt.gz', 'rb')
file_content = f.read()
f.close()


 类似资料:
  • tar [-]c|x|u|r|t[z|j][v] -f 归档文件 [待打包文件] 将多个文件打包为一个归档文件,可以在打包的同时进行压缩。支持的格式为 tar(归档)、gz(压缩)、bz2(压缩率更高,比较耗时) 操作选项 -c 创建 -x 解包 -u 更新 -r 添加 -t 查看 -d 比较压缩包内文件和文件 -A 将 tar 文件添加到归档文件中 格式选项 -z 使用 gz 压缩格式 -j 使

  • 6LoWPAN 定义了两种 IPv6 包压缩格式:LOWPAN_IPHC 和 LOWPAN_NHC。 为了能够更高效地压缩,LOWPAN_IPHC 依赖于完整的 6LoWPAN 信息。LOWPAN_IPHC 假设 6LoWPAN 通信都遵循下列条件: IP 的版本是 IPv6。 业务类型和 流标签都是零。 负载长度可以从下层协议头(6LoWPAN 分片头部或者 IEE E802.15.4 头部)中

  • 我正在使用Julia的ZipFile包来提取和处理csv文件。没问题,但是当我遇到zip文件中的zip文件时,我也想处理它,但是遇到了一个错误。 Julia ZipFile文档如下:https://zipfilejl.readthedocs.io/en/latest/ 对如何做到这一点有什么想法吗?

  • 问题:您有一个nxn网格(1 我试图用BFS解决这个问题,但是对于非常大的网格维度来说,它太慢了。然后我听说了坐标压缩。有人能解释一下什么是坐标压缩,它是如何实现的,我在哪里可以了解更多?

  • 问题内容: 我正在使用php的功能来执行HTTP请求。为了节省带宽,我决定使用添加标题。 显然,输出一个gzip编码的字符串,所以我用来解码该编码的字符串,但是将作为参数传递的数据出错。 我知道还有另一个功能可以解压缩压缩后的数据,但是它不包含在我的PHP版本中(也许仅在SVN上可用)。 我知道cUrl可以即时解码gzip流(没有任何问题),但是有人建议我使用它而不是cUrl。 您是否知道以其他方

  • 问题内容: 我知道这是一项容易的任务,但是更改代码后它停止工作,并且无法恢复!我实际上使用了两个函数来进行压缩和解压缩,尽管实际上它是“ jar”和“ unjar”,但这并没有太大的区别 任何帮助/建议吗? 创建JarFile时发生错误: 问题答案: 我不知道这是否是您的问题,但是通常最好在完成写入后关闭每个zip条目。 请参阅。 在显示的代码中,不会关闭邮政编码中的最后一个条目。您也不会显示关闭