deflate 格式,尤其是动态霍夫曼编码

Xan*_*ros 2 deflate

我目前正在实现一个 png 阅读器,但我对数据的位顺序和一般格式感到困惑。

我无权访问 libpng、zlib 或类似的东西。
请注意,我写的任何位串都是最重要的位。

根据RFC1951,“数据元素被打包 [...] 从最低有效位开始”

我的示例图像的第一个字节是:11101101
要读取标题,我反转位顺序并得到:10110111

第一点是说这是最后一个块,这是有道理的。接下来的2位是“01”,这意味着静态还是动态霍夫曼编码?RFC 仅将它们作为位提及,但没有提及它们的顺序或它们的数值。

假设采用动态霍夫曼编码,首部后跟 2 个霍夫曼字母表。然而,这些也是编码的。0-15 用作文字,16 将前面的代码重复(3 + 后面的 2 位)次。我假设 17 和 18 重复文字 0 是否正确?

进一步的问题是:

  • 我是否正确理解了所有这些?
  • 我怎么知道字母编码结束和下一个开始?
  • 与标题位相比,字母表和实际压缩数据的位顺序是什么?

我想我不明白3.2.7章的大部分内容......

Mar*_*ler 5

除了霍夫曼码外,不要反转位,只有在您的解码方法需要时才反转。zlib 的膨胀永远不会反转位。puff 保留位仅用于解码霍夫曼码。如果您尝试解释反转的所有位,您会感到困惑,并且您将不得不取消反转偏移位。

只需从底部读取位。

在您的示例中,11101101底部位1表示第一个块也是最后一个块。接下来的两位(未反转)10表示它是一个动态块。

您可以在zlib发行版puff.ccontrib/puff目录中使用, 作为对 RFC 1951 的补充。 被编写为一个简单而清晰的 inflate 实现,以提供 deflate 格式的明确定义。puff.c