我对这个问题的希望(参见:下图)就是我所知道的关于放气过程的内容,我可以接受有关我(可能非常)误导的领域的更正。希望在最后,这个问题可以成为一个方便的资源。
前两个字节等同于zlib压缩的标头,格式为(credit)
---CMF--- ---FLG---
0111.1000 1101.0101
CINF -CM- +-||
| |+- FCHECK
| +-- FDICT
+---- FLEVEL
从RFC 1950,从右到左:
FCHECK(1.0101) - 验证CMF&作为16位无符号整数的FLG是31
FDICT(0) - 如果设置,则表示在FLG之后立即预设DICT
FLEVEL(11) - 压缩"强度" [0-3]
CM(1000) - 用于压缩方法,其中CM = 8 ==" deflate"压缩方法
CINF(0111) - 表示使用的滑动窗口的大小,其中CINF = 7 = = 32K滑动窗口
NEW BYTE中的后三位等同于Huffman编码块的标题:
---CMF--- ---FLG--- NEW BYTE
0111.1000 1101.0101 11101100
|-|
| +- BFINAL
+--- BTYPE
从RFC 1951从右到左:
BFINAL(0) - 如果这是最后一个数据块,则设置为(1)
BTYPE(10) - 霍夫曼编码:(00)无; (01)固定霍夫曼码; (10)动态代码; (11)无效
从这里开始,我将假设BTYPE =(10)
以下值立即继续:
NEW BYTE NXT BYTE
(11101)100 -> 101)(11101) -> 0111111(1
|-|
| +- BFINAL
+--- BTYPE
HLIT
(11101) - 5位长度/文字代码,257添加(257-286)
HDIST
(11101) - 5位距离代码,1添加(1-32)
HCLEN
(1111) - 4位代码长度代码,4添加(4-19)
紧随其后的是HCLEN
(不要忘记+4)3位字段,其中值按顺序分配给此序列:
16 17 18 0 8 7 9 6 10 5 11 4 12 3 13 2 14 1 15
由于HCLEN = 19,因此使用整个序列
该序列中的代码长度0
表示不使用相应的符号。
作为一个图形示例,在读取19x3位后,我们有六个额外位(括号中的额外位):
NXT BYTE 00000000 00000000 00000000 00000000 00000000 00000000 [000000](00
上面括号中的最后几位被扔掉了吗?
答案 0 :(得分:4)
没有。在deflate流中,跳过位转到字节边界的唯一时间是存储块(00),或者读取最后一个块中的结束代码。在代码长度代码长度的位之后,继续后续位以使用生成的霍夫曼代码来读取代码长度。