我对这个问题的希望(见:底部)就是我所知道的关于放气过程的内容,我可以得到关于我(可能非常)误导的领域的更正 . 希望在最后,这个问题可能是一个方便的资源 .
Zlib Headers
前两个字节等同于zlib压缩的标头,格式为(credit)
---CMF--- ---FLG---
0111.1000 1101.0101
CINF -CM- +-||
| |+- FCHECK
| +-- FDICT
+---- FLEVEL
从RFC 1950,从右到左:
-
FCHECK(1.0101) - 验证CMF和FLG为16位无符号整数是31的倍数
-
FDICT(0) - 如果设置,则表示紧跟FLG后的预设DICT
-
FLEVEL(11) - 压缩“强度”[0-3]
-
CM(1000) - 用于压缩方法,其中CM = 8 ==“deflate”压缩方法
-
CINF(0111) - 表示使用的滑动窗口的大小,其中CINF = 7 == 32K滑动窗口
数据块 Headers
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位后,我们有6个额外位(括号中的额外位):
NXT BYTE 00000000 00000000 00000000 00000000 00000000 00000000 [000000](00
我的问题
上面括号中的最后几位被丢弃了吗?
1 回答
不可以 . 在通信流中,跳过位转到字节边界的唯一时间是存储块(00),或者读取最后一个块中的结束代码 . 在代码长度代码长度的位之后,继续后续位以使用生成的霍夫曼代码来读取代码长度 .