DEFLATE:动态块结构

时间:2018-12-29 21:23:47

标签: deflate

我正在尝试构造一个动态块的显式示例。如果这是错误的,请让我知道。

考虑上例中的亮/楞字母:

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,一些额外的位值。 (由于最大重复计数为138,可能还会有18个标志。)

然后我们用距离字母进行相同处理,最后使用标准霍夫曼编码输入数据,并在必要时添加额外的位。

  1. 是否需要发送代码长度为0的代码?如果是这样,为什么?

  2. 如果是,那么知道序列的长度(对于lit / len是286,对于距离是30),为什么必须要有hclit和hcdist而不是hclen?

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

另一个问题:

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

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

如果是,我不知道怎么做:标志18接下来具有一个最大可能的额外位值127(1111111),表示138次重复,并且不能包含在0-18的字母符号中。

P.S在这种情况下,当我说多余的位时,我的意思是用来了解使用前一个长度的重复次数的因素。

更精确地说,0-15的重复因子为0,对于16,17,18,我们的重复因子为2,3,7。这些位的值就是我所说的多余位的值。

我想我缺少有关霍夫曼代码长度字母表生成的霍夫曼代码的信息。

1 个答案:

答案 0 :(得分:0)

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

按顺序回答您的问题:

  1. 您需要发送前导零,但无需发送后缀零。 HLIT和HDIST计数确定标头中每种代码类型的长度,之后的长度取为零。您需要发送零,因为代码长度通过列表中的位置与相应的符号相关联。

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

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

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

    < / li>