我有一个编码的字符串,在不知道其原始编码方式的情况下设法对其进行了解码。这就是我设法解码的方式:
<address>
我想指出zlib参数'-15'是强制性的(在-8到-15之间有效)
但是,如果我想将纯文本字符串编码为完全相同的格式,以使上面的代码也能成功地解码该文本,则会遇到问题。
我检查了zlib文档并尝试了zlib.compress,并创建了compressobj并尝试对其进行压缩,但是没有成功。
似乎无法将此“ -15”值输入到任何可以逆转我最初进行的解压缩的函数中。
这也是我尝试过的方法,但是输出为空:
original_str = "LONG_SNIP" # Is clearly a base64 string
decoded_str = base64.b64decode(original_str) # Becomes unreadable mess
decompressed_str = zlib.decompress(decoded_str, -15) # Plain text, success
问题:
整数参数是什么意思,为什么-8和-15之间的所有值都给出相同的精确输出?
更重要的是,我该如何减压?
非常感谢,谢谢!
答案 0 :(得分:1)
zlib.decompress()
的第二个参数是 wbits 参数。来自documentation:
wbits 参数控制历史记录缓冲区的大小(或“窗口大小”),以及期望的标头和结尾格式。它类似于
compressobj()
的参数,但是接受更多范围的值:
- [...]
- -8至-15:使用wbits的绝对值作为窗口大小的对数。输入必须是没有标题或尾部的原始流。
- [...]
解压缩流时,窗口大小不得小于最初用于压缩流的大小;使用太小的值可能会导致
error
异常。
负值仅表示数据流中没有标题或结尾。
因此,如果介于-8和-15之间的任何值起作用,则压缩时的窗口大小开始时会很小。较大的窗口大小需要更大的历史缓冲区更大的内存,但会使解压缩更快。唯一的要求是它应该等于或大于用于压缩数据的那个,因为否则将无法再找到对压缩流中使用的先前数据块的引用(我想,我敢肯定Mark Adler如果我错了,会纠正我的问题。
zlib manual似乎暗示wbits=8
实际上将自动被wbits=9
取代,并且可能与-8
相同。
这表示-9和-15之间的zlib.compresobj()
个 wbits 值;再次从文档中获取:
- -9至-15:使用wbits的绝对值作为窗口大小的对数,同时生成没有标题或尾随校验和的原始输出流。
以最小的窗口大小压缩就足够了:
compressor = zlib.compressobj(-1, zlib.DEFLATED, -9)
compressed = compressor.compress(data_to_compress) + compressor.flush()
演示:
>>> import zlib
>>> compressor = zlib.compressobj(-1, zlib.DEFLATED, -9)
>>> compressor.compress('foo bar baz') + compressor.flush()
'K\xcb\xcfWHJ,\x02\xe2*\x00'
>>> zlib.decompress(_, -8)
'foo bar baz'