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

如何使用zlib解压缩gzip流?

董联
2023-03-14
问题内容

Gzip格式文件(gzip例如,使用程序创建的文件)使用“放气”压缩算法,该压缩算法与zlib使用的压缩算法相同。但是,使用zlib膨胀gzip压缩文件时,该库将返回Z_DATA_ERROR。

如何使用zlib解压缩gzip文件?


问题答案:

python

zlib库支持:

  • RFC 1950(zlib压缩格式)
  • RFC 1951(deflate压缩格式
  • RFC 1952(gzip压缩格式)
  • pythonzlib模块也将支持这些。

选择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)
>>> f = gzip.GzipFile(fileobj=fio)
>>> f.read()
'test'
>>> f.close()

自动标头检测(zlib或gzip)
加入32到windowBits将触发标题检测

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

使用gzip代替
对于gzip带有gzip标头的数据,您可以gzip直接使用模块。但请记住,在引擎盖下,gzip使用zlib。

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


 类似资料:
  • null 在最近的更新中,解压库工作,但解包不工作。请跳到底部9月16日的更新。 我已经尝试了几个JavaScript库,但仍然无法使其工作: Pako:https://github.com/nodeca/pako null Imaya的zlib:https://github.com/imaya/zlib.js 错误: 仍然使用Imaya的zlib,结合这个堆栈溢出问题:解压缩javascript

  • 我的javascript代码是 它运行时显示消息错误“不支持的压缩方法”。但是我尝试用在线工具http://i-tools.org/gzip解压,它返回正确的字符串。

  • Stability: 2 - Stable zlib 模块提供通过 Gzip 和 Deflate/Inflate 实现的压缩功能,可以通过这样使用它 const zlib = require('zlib'); 压缩或者解压数据流(例如一个文件)通过zlib流将源数据流传输到目标流中来完成。 const gzip = zlib.createGzip(); const fs = require('f

  • 我想在JavaScript中做解压缩图像。我已经用C#使用gzip压缩了图像。如何在JavaScript中解压缩gzipped数据? C#代码

  • 问题内容: 有人可以向我解释zlib库在Nodejs中如何工作吗? 我对Node.js很陌生,还不确定如何使用缓冲区和流。 我的简单情况是一个字符串变量,我想将字符串压缩或解压缩(压缩或膨胀,gzip或gunzip等)到另一个字符串。 即(我希望它如何工作) 感谢您的帮助:) 问题答案: 更新 :没意识到在节点0.5中有一个新的内置“ zlib”模块。我在下面的答案是针对第三方node- zlib

  • 处理内存中的数据 # zlib_memory.py import zlib import binascii original_data = b'This is the original text.' print('Original :', len(original_data), original_data) compressed = zlib.compress(original_dat