deflate格式,特别是动态霍夫曼编码

时间:2014-03-19 07:33:30

标签: deflate

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

我无法访问libpng,zlib或类似内容 请注意,我写的任何位串都是最重要的位。

根据RFC1951,"数据元素从最低位开始打包["

我的样本图像的第一个字节是:11101101
为了读取标题,我反转位顺序并得到:10110111

第一位是说这是最后一个块,这是有道理的。接下来的2位是" 01",这是指静态还是动态霍夫曼编码? RFC仅将它们称为位,而不是它们的顺序或数值。

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

进一步的问题是:

  • 我是否理解这一切?
  • 我如何知道字母编码结束,下一次开始?
  • 与标题位相比,字母和实际压缩数据的位顺序是什么?

我想我不太了解第3.2.7章......

的大部分内容

2 个答案:

答案 0 :(得分:3)

除了霍夫曼代码之外,不要反转这些位,只有当你的解码方法需要它时才能反转。 zlib的膨胀从不反转这些比特。 puff仅保留位以解码霍夫曼码。如果您尝试解释所有反转的位,您将会感到困惑,并且您必须取消反向偏移位。

只需阅读底部的位。

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

您可以在puff.c发行版的contrib/puff目录中使用zlib作为RFC 1951的补充。puff.c编写为简单明了的实现膨胀,以提供deflate格式的明确定义。

答案 1 :(得分:1)

动态霍夫曼。

Mark Adler 的回答(从底部阅读)是编码时考虑它的正确方法,尽管在跨越字节边界时可能会令人困惑——请确保加载一个以上的字节以避免任何混淆。

>

我发现在手动一点一点地解决问题时,这不是一种有用的方法,而多次倒车对我来说效果更好,就像你正在做的那样。

如果您可以在另一台计算机上安装软件,我推荐 infgen,这是 Mark 为 zlib/gzip 流和文件编写的调试工具,它有助于检查您对标准的理解。该文档位于 .c 文件中的一个相当大的注释中,而不是在 README 中。

我自己也写了一些worked examples。我意识到我可能应该将它们复制到堆栈溢出以使其独立,但它确实运行到 5 页的精细细节并且没有直接解决您的问题。