【发布时间】: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 编码的输入数据,必要时还有额外的位。
是否需要发送码长为0?如果是,为什么?
如果是,为什么需要 hclit 和 hcdist 而不仅仅是 hclen,知道序列的长度是 lit/len 的 286 和距离的 30?
如果不是,真正的解决方案是什么?
另一个问题:
在这种情况下,我们的代码长度为 2,重复 (3) 个额外的比特值为 0。
- 最后一个数字是否也包含在代码长度树构造中?
如果是,我无法理解:标志 18 的下一个最大可能额外位值为 127 (1111111),表示 138 次重复,它不能包含在 0-18 的字母符号中。
P.S 当我在这种情况下说额外的位时,我的意思是它用于知道使用了多少之前长度的重复的因素。
更准确地说,0 - 15 我们有 0 位重复因子,对于 16、17、18,我们有 2、3、7 位重复因子。这些位的值就是我所说的额外位值。
我想我遗漏了一些关于霍夫曼代码长度字母表生成的霍夫曼代码的内容。
【问题讨论】:
标签: deflate