【发布时间】:2015-09-06 01:08:35
【问题描述】:
我无法理解 Deflate 算法 (RFC 1951)。
TL; DR如何解析Deflate压缩块4be4 0200?
我创建了一个包含字母和换行符a\n 的文件,然后运行gzip a.txt。结果文件a.txt.gz:
1f8b 0808 fe8b eb55 0003 612e 7478 7400
4be4 0200
07a1 eadd 0200 0000
我知道第一行是带有附加信息的标题,最后一行是 CRC32 加上输入大小 (RFC 1951)。这两个对我没有任何麻烦。
但是我如何解释压缩块本身(中间线)?
这是它的十六进制和二进制表示:
4be4 0200
0100 1011
1110 0100
0000 0010
0000 0000
据我了解,不知何故这些:
每个压缩数据块都以包含以下数据的 3 个标头位开始:
- 第一位 BFINAL
- 接下来的 2 位 BTYPE
...实际上结束于第一个字节的end:0100 1011。 (我将跳过这个问题,为什么有人将实际上位于其他事物尾部的事物称为“标题”。)
RFC 包含的内容据我所知应该是对此的解释:
- 数据元素按顺序打包成字节 增加字节内的位数,即开始 字节的最低有效位。
- 哈夫曼码以外的数据元素被打包 从数据的最低有效位开始 元素。
- 霍夫曼编码从最- 代码的重要部分。
换句话说,如果将压缩数据打印为 一个字节序列,从第一个字节开始 right 边距并继续到 left,最- 像往常一样,左侧每个字节的有效位是 能够以固定宽度从右到左解析结果 正确的 MSB 到 LSB 顺序和 Huffman 代码中的元素 位反转顺序(即,与代码的第一位在 相对 LSB 位置)。
但遗憾的是我不明白那个解释。
返回我的数据。 OK,这样BFINAL就设置好了,BTYPE是什么? 10 点还是 01 点?
我如何解释该压缩块中的其余数据?
【问题讨论】:
-
您的数据不仅仅是字母“a”。它是字母 'a' 后跟换行符,'\n' 或十进制 10。所以那里编码了两个字节,而不仅仅是一个。
-
@MarkAdler 感谢您指出这一点。
-
您可以使用 infgen,一个 deflate 流反汇编器,帮助您理解 RFC 1951。将流反汇编为可读描述,以及 infgen.c 代码本身进一步说明deflate 格式的构造。
-
@MarkAdler 这个程序很有帮助。您可以添加指向它的链接作为答案。虽然正式它并没有直接回答我的问题,但它是相关的并且非常有用。我不会改变接受的答案,但我一定会给你+1。
标签: unix assembly bit-manipulation gzip deflate