我在理解Deflate算法(RFC 1951)时遇到了困难。
简短概述:如何解析压缩块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
据我理解,以下这些部分:
实际上是以以下的方式结束于第一个字节的结尾:0100 1011。(我跳过了为什么把实际上在其他地方结尾的东西称为“头部”的问题。)每个压缩数据块都以3位头部比特开始,包含以下数据:
- 第一位 BFINAL
- 接下来的2位 BTYPE
RFC文档中包含了一些内容,据我理解应该是对此进行解释的:
但是遗憾的是,我无法理解这个解释。
- 数据元素按照字节中递增的位序打包,即从字节的最低有效位开始。
- 不是Huffman代码的数据元素,按照数据元素的最低有效位开始打包。
- Huffman代码按照代码的最高有效位开始打包。
换句话说,如果将压缩数据作为字节序列打印出来,则从右边开始,按顺序排列每个固定宽度元素和反转编码顺序的Huffman代码(即代码的第一个比特位于相对LSB位置)。每个字节的最高有效位仍在左侧,因此可以从右向左解析结果。
回到我的数据。好的,那么BFINAL已经设置了,BTYPE是什么?10还是01?
我如何解释压缩块中其余的数据?