【问题标题】:Info-ZIP DEFLATE fixed Huffman inefficienciesInfo-ZIP DEFLATE 修复了 Huffman 效率低下的问题
【发布时间】:2015-02-09 01:31:49
【问题描述】:

例如,考虑一个包含 7 个换行符(字节 [0x0A、0x0A、0x0A、0x0A、0x0A、0x0A、0x0A])的文件。使用 zip 的 Info-ZIP 实现(OSX 和其他操作系统附带)创建一个 zip 文件,该文件以固定的霍夫曼模式(模式 01)存储。文件数据块中的字节为:

0xE3 0xE2 0x02 0x03 0x00

根据位,有一个块(第一个标头的最后一个块位设置为真)。

块中的第一个代码是文字 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 个字节的副本。是否有原因(例如另一个实现中的错误)不应该使用更有效的编码?

【问题讨论】:

    标签: zip deflate


    【解决方案1】:

    来自deflate.c

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

    【讨论】:

    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2023-03-23
    • 2015-02-14
    相关资源
    最近更新 更多