使用zlib重新压缩解压缩的字符串

时间:2019-04-04 20:32:49

标签: python python-2.7 compression zlib

我有一个编码的字符串,在不知道其原始编码方式的情况下设法对其进行了解码。这就是我设法解码的方式:

<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之间的所有值都给出相同的精确输出?

更重要的是,我该如何减压?

非常感谢,谢谢!

1 个答案:

答案 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'