我目前正在实现一个png阅读器,但我对数据的位顺序和一般格式感到困惑。
我无法访问libpng,zlib或类似内容 请注意,我写的任何位串都是最重要的位。
根据RFC1951,"数据元素从最低位开始打包["
我的样本图像的第一个字节是:11101101
为了读取标题,我反转位顺序并得到:10110111
第一位是说这是最后一个块,这是有道理的。接下来的2位是" 01",这是指静态还是动态霍夫曼编码? RFC仅将它们称为位,而不是它们的顺序或数值。
假设动态霍夫曼编码,标题后跟2个霍夫曼字母。然而,这些也是编码的。 0-15作为文字,16重复之前的代码(3 +跟随2位)次。我是否正确假设17和18重复文字0?
进一步的问题是:
我想我不太了解第3.2.7章......
的大部分内容答案 0 :(得分:3)
只需阅读底部的位。
在您的示例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 页的精细细节并且没有直接解决您的问题。