【问题标题】:DEFLATE: dynamic block structureDEFLATE:动态块结构
【发布时间】:2019-05-27 03:48:46
【问题描述】:

我正在尝试构建一个动态块的显式示例。如果有错误请告诉我。

考虑这个 lit/len 字母表的例子:

A(0)、B(0)、C(1)、D(0)、E(2)、F(2)、G(2)、H(2) 其余符号的代码长度为零。

代码长度的序列(SQ)将是 0...,0,0,1,0,2,2,2,2,...0。

然后我们必须使用游程编码进一步压缩它。所以我们必须计算重复次数,或者使用标志 16 来复制之前的代码长度,或者使用 17 或 18 来重复代码长度 0(使用额外的位)。

我的问题是这个。在以正确的顺序 16,17,18,... 发送头信息和码长码长序列后,下一个信息序列将类似于:

18,一些额外的位值,1,0,2,16,一些额外的位值 0,18,一些额外的位值。 (可能会有另外 18 个标志,因为最大重复计数是 138。)

然后我们对距离字母表有相同的东西,最后是用规范 Huffman 编码的输入数据,必要时还有额外的位。

  1. 是否需要发送码长为0?如果是,为什么?

  2. 如果是,为什么需要 hclit 和 hcdist 而不仅仅是 hclen,知道序列的长度是 lit/len 的 286 和距离的 30?

  3. 如果不是,真正的解决方案是什么?

另一个问题:

在这种情况下,我们的代码长度为 2,重复 (3) 个额外的比特值为 0。

  1. 最后一个数字是否也包含在代码长度树构造中?

如果是,我无法理解:标志 18 的下一个最大可能额外位值为 127 (1111111),表示 138 次重复,它不能包含在 0-18 的字母符号中。

P.S 当我在这种情况下说额外的位时,我的意思是它用于知道使用了多少之前长度的重复的因素。

更准确地说,0 - 15 我们有 0 位重复因子,对于 16、17、18,我们有 2、3、7 位重复因子。这些位的值就是我所说的额外位值。

我想我遗漏了一些关于霍夫曼代码长度字母表生成的霍夫曼代码的内容。

【问题讨论】:

    标签: deflate


    【解决方案1】:

    首先,您的示例代码无效,因为它超额订阅了可用的位模式。 2,2,2,2 将使用所有位模式,因为只有四种可能的两位模式。您不能再拥有任何长度的代码。五个符号的可能有效代码是 1、2、3、4、4 或 2、2、2、3、3。

    按顺序回答您的问题:

    1. 您需要发送前导零,但不需要发送尾随零。 HLIT 和 HDIST 计数决定了每种代码类型在标头中有多少长度,在这些长度之后的任何长度都被视为零。您需要发送零,因为代码长度通过它们在列表中的位置与相应的符号相关联。

    2. 它节省了标头中的空间来进行 HLIT 和 HDIST 计数,因此您无需为每个标头中的所有 316 个代码提供长度。

    3. 我不明白这个问题,但我想它不适用。

    4. 如果我理解您的问题,多余的位与标题中 Huffman 代码的描述无关。符号暗示了额外的位。在任何情况下,重复的长度都是用代码 16 编码的,而不是代码 18。所以四个 2 将被编码为 2, 16(0),其中 (0) 表示两个额外的零位。

    【讨论】:

    • 非常感谢您为回答我的问题所做的努力,对此您表示感谢。对于最后一个问题,当我说额外位时,我的意思是您在标志 16 之后添加的位因子编号,在这种情况下为 00,如您所说,而不是在数据的霍夫曼代码之后添加的实际额外位。在这种情况下,00 也包含在霍夫曼码长字母表的可能符号中?也就是说,所有run-encoding之后的序列中的数字都作为码长字母表的可能符号?
    • 没有。额外位是直接进入流的额外位。正如我所说,它们与霍夫曼密码无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    相关资源
    最近更新 更多