Info-ZIP DEFLATE修复了霍夫曼效率低下的问题

时间:2014-12-10 18:16:05

标签: zip deflate

例如,考虑一个由7个换行符组成的文件(字节[0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A])。使用zip的Info-ZIP实现(这与OSX和其他操作系统一起提供)来创建zip文件,该文件以固定的霍夫曼模式存储(模式01)。文件数据块中的字节是:

0xE3 0xE2 0x02 0x03 0x00

根据这些位,有一个块(第一个头的最后一个块位设置为true)。

块中的第一个代码是文字0x0A(接下来的7位编码为0x5C,以下是0)。块中的第二个代码是文字0x0A,块中的第三个代码表示距离为1的5个字节的副本。

如果我理解正确的操作,则不会复制第一个文字。逐字节,使用*标记要复制到结尾的字节,操作是:

[0x0A *0x0A]                          ->  [0x0A  0x0A  0x0A]
[0x0A  0x0A *0x0A]                    ->  [0x0A  0x0A  0x0A *0x0A]
[0x0A  0x0A  0x0A *0x0A]              ->  [0x0A  0x0A  0x0A  0x0A *0x0A]
[0x0A  0x0A  0x0A  0x0A *0x0A]        ->  [0x0A  0x0A  0x0A  0x0A  0x0A *0x0A]
[0x0A  0x0A  0x0A  0x0A  0x0A *0x0A]  ->  [0x0A  0x0A  0x0A  0x0A  0x0A  0x0A *0x0A]

问题:从图中可以清楚地看出,第一个字节没有被复制。最有效的编码只需要两个代码:字面值0x0A和距离为1的6字节副本。是否有理由(例如,另一个实现中的错误)为什么不应该使用更有效的编码?

1 个答案:

答案 0 :(得分:0)

来自deflate.c

/* Stop when cur_match becomes <= limit. To simplify the code,
 * we prevent matches with the string of window index 0.
 */