Compression 为什么可以';t deflate(zlib)压缩连接在一起的两个相同字符串?

Compression 为什么可以';t deflate(zlib)压缩连接在一起的两个相同字符串?,compression,gzip,zlib,deflate,data-compression,Compression,Gzip,Zlib,Deflate,Data Compression,或者更准确地说,当两个相同的字符串互相连接时,为什么zlib不能对整个第二个字符串进行放气?似乎当匹配字符串在同一字符串的前一个实例之后立即开始时,zlib会发出第一个字符作为字符串文本,然后发出对前一个字符串减去第一个字符的向后引用 例如,如果我使用zlib对字符串latelate进行放气,则输出为5个字符串文本,后跟一个back引用 l a t e l <len=3, dist=4> 其中,我通过使用“原始”deflate流(即windowBits=-15)和固定的哈夫曼编码(

或者更准确地说,当两个相同的字符串互相连接时,为什么zlib不能对整个第二个字符串进行放气?似乎当匹配字符串在同一字符串的前一个实例之后立即开始时,zlib会发出第一个字符作为字符串文本,然后发出对前一个字符串减去第一个字符的向后引用

例如,如果我使用zlib对字符串latelate进行放气,则输出为5个字符串文本,后跟一个back引用

l a t e l <len=3, dist=4>
其中,我通过使用“原始”deflate流(即windowBits=-15)和固定的哈夫曼编码(即压缩策略是Z_固定的)简化了输出

为什么zlib必须在使用对“ate”的反向引用之前发出第二个文本字符“l”

换句话说,为什么它不能输出

l a t e <len=4, dist=4>
late

我尝试用自己的deflate实现强制第二个版本,但是zlib不会使输出膨胀。我得到错误“无效或不完整的deflate数据”。

让我们分开deflate,作为zlib中描述的压缩比特流格式,它是编码和解码此类比特流的算法的实现

然后,DEFLATE当然可以表示并压缩两个字符串的串联。为什么zlib不这么做?嗯,因为LZ77压缩的匹配搜索本质上是一项启发式任务,所以有些选择不会被探索,即使是对人类来说显而易见的选择

使用一个基于散列的LZ77编码器,很容易找到双字符串大小写:

L6c # l
L61 # a
L74 # t
L65 # e
C-4,4
并且该序列可以用静态zlib编码而不会出现问题,结果是:

CB 49 2C 49 05 61 00
zlib也可以毫无问题地对该比特流进行解码。您可以尝试使用Python:

import zlib
import binascii
zlib.decompress(binascii.unhexlify("CB492C49056100"), -15)

那么,您使用了什么版本的zlib?也许它太旧了?

谢谢。我一定是手工把字符串编错了。我检查了你的编码,它被解压得很好。讽刺的是,我在我自己的介绍中也提出了同样的论点:)。。。RFC1951明确指出,“deflate”格式与任何特定算法无关。引用一下,它说,“虽然本文档的目的是定义‘deflate’压缩数据格式,而不参考任何特定的压缩算法,但该格式与LZ77生成的压缩格式相关……[然而]压缩机不需要遵循该格式才能符合要求。”
import zlib
import binascii
zlib.decompress(binascii.unhexlify("CB492C49056100"), -15)