在 (HCLEN + 4) x 3 位之后解码放气块
decoding deflate blocks after (HCLEN + 4) x 3 bits
所以在 deflate 算法中,每个块都以 3 位开始 header:
Each block of compressed data begins with 3 header bits
containing the following data:
first bit BFINAL
next 2 bits BTYPE
假设BTYPE为10(动态霍夫曼编码压缩)则接下来的14位如下:
5 Bits: HLIT, # of Literal/Length codes - 257 (257 - 286)
5 Bits: HDIST, # of Distance codes - 1 (1 - 32)
4 Bits: HCLEN, # of Code Length codes - 4 (4 - 19)
接下来的 (HCLEN + 4) x 4 位表示代码长度。
之后发生的事情我不太清楚。
RFC1951 § 3.2.7。使用动态霍夫曼编码 (BTYPE=10) 的压缩是这样说的:
HLIT + 257 code lengths for the literal/length alphabet,
encoded using the code length Huffman code
HDIST + 1 code lengths for the distance alphabet,
encoded using the code length Huffman code
在 1589c11100000cc166a3cc61ff2dca237709880c45e52c2b08eb043dedb78db8851e
上执行 infgen -ddis
(通过执行 gzdeflate('A_DEAD_DAD_CEDED_A_BAD_BABE_A_BEADED_ABACA_BED')
生成)给出:
zeros 65 ! 0110110 110
lens 3 ! 0
lens 3 ! 0
lens 4 ! 101
lens 3 ! 0
lens 3 ! 0
zeros 25 ! 0001110 110
lens 3 ! 0
zeros 138 ! 1111111 110
zeros 22 ! 0001011 110
lens 4 ! 101
lens 3 ! 0
lens 3 ! 0
zeros 3 ! 000 1111
lens 2 ! 100
lens 0 ! 1110
lens 0 ! 1110
lens 2 ! 100
lens 2 ! 100
lens 3 ! 0
lens 3 ! 0
我注意到 65 是 ASCII 中“A”的十六进制编码,这大概解释了“zeros 65”。
"lens"出现16次,等于HCLEN + 4.
在 RFC1951 § 3.2.2 中。在“deflate”格式中使用霍夫曼编码是这样的:
2) Find the numerical value of the smallest code for each
code length:
code = 0;
bl_count[0] = 0;
for (bits = 1; bits <= MAX_BITS; bits++) {
code = (code + bl_count[bits-1]) << 1;
next_code[bits] = code;
}
也许这就是“zeros 65”的含义,但是“zeros 25”、“zeros 138”和“zeros 22”又如何呢? ASCII 中的 25、138 和 22 不会出现在压缩文本中。
有什么想法吗?
接下来的 (HCLEN + 4) x 3 位表示代码长度。
lens
的数量与HCLEN
无关。 zeros
和lens
的序列表示269(259+10)literal/length和距离码的码长。如果将零和 lens
的数量相加,您将得到 269。
零长度符号表示它不会出现在压缩数据中。 0..64 范围内的数据中没有文字字节,因此它以 65 个零开头。编码的第一个符号是 'A',长度为 3.
所以在 deflate 算法中,每个块都以 3 位开始 header:
Each block of compressed data begins with 3 header bits
containing the following data:
first bit BFINAL
next 2 bits BTYPE
假设BTYPE为10(动态霍夫曼编码压缩)则接下来的14位如下:
5 Bits: HLIT, # of Literal/Length codes - 257 (257 - 286)
5 Bits: HDIST, # of Distance codes - 1 (1 - 32)
4 Bits: HCLEN, # of Code Length codes - 4 (4 - 19)
接下来的 (HCLEN + 4) x 4 位表示代码长度。
之后发生的事情我不太清楚。
RFC1951 § 3.2.7。使用动态霍夫曼编码 (BTYPE=10) 的压缩是这样说的:
HLIT + 257 code lengths for the literal/length alphabet,
encoded using the code length Huffman code
HDIST + 1 code lengths for the distance alphabet,
encoded using the code length Huffman code
在 1589c11100000cc166a3cc61ff2dca237709880c45e52c2b08eb043dedb78db8851e
上执行 infgen -ddis
(通过执行 gzdeflate('A_DEAD_DAD_CEDED_A_BAD_BABE_A_BEADED_ABACA_BED')
生成)给出:
zeros 65 ! 0110110 110
lens 3 ! 0
lens 3 ! 0
lens 4 ! 101
lens 3 ! 0
lens 3 ! 0
zeros 25 ! 0001110 110
lens 3 ! 0
zeros 138 ! 1111111 110
zeros 22 ! 0001011 110
lens 4 ! 101
lens 3 ! 0
lens 3 ! 0
zeros 3 ! 000 1111
lens 2 ! 100
lens 0 ! 1110
lens 0 ! 1110
lens 2 ! 100
lens 2 ! 100
lens 3 ! 0
lens 3 ! 0
我注意到 65 是 ASCII 中“A”的十六进制编码,这大概解释了“zeros 65”。
"lens"出现16次,等于HCLEN + 4.
在 RFC1951 § 3.2.2 中。在“deflate”格式中使用霍夫曼编码是这样的:
2) Find the numerical value of the smallest code for each
code length:
code = 0;
bl_count[0] = 0;
for (bits = 1; bits <= MAX_BITS; bits++) {
code = (code + bl_count[bits-1]) << 1;
next_code[bits] = code;
}
也许这就是“zeros 65”的含义,但是“zeros 25”、“zeros 138”和“zeros 22”又如何呢? ASCII 中的 25、138 和 22 不会出现在压缩文本中。
有什么想法吗?
接下来的 (HCLEN + 4) x 3 位表示代码长度。
lens
的数量与HCLEN
无关。 zeros
和lens
的序列表示269(259+10)literal/length和距离码的码长。如果将零和 lens
的数量相加,您将得到 269。
零长度符号表示它不会出现在压缩数据中。 0..64 范围内的数据中没有文字字节,因此它以 65 个零开头。编码的第一个符号是 'A',长度为 3.