我的希望是在这个问题中(见:底部)尽可能地阐述我对压缩过程的了解,并且我可以在我知识存在偏差的领域接受更正。希望最终,这个问题可以成为一个方便的资源。
Zlib头
前两个字节等同于zlib压缩的头,与格式为(来源:credit)。
自从HCLEN = 19以来,整个序列都被使用了。
在该序列中,代码长度为0意味着相应的符号未被使用。
作为一个图形示例,在读取19x3位后,我们有六个额外的位(括号内的额外位):
Zlib头
前两个字节等同于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后紧接着包含预设字典
FLEVEL(11) - 压缩“强度”[0-3]
CM(1000)- 压缩方法,其中CM=8==“deflate”压缩方法
CINF(0111)- 指示所使用的滑动窗口的大小,其中CINF=7==32K滑动窗口
数据块头
新字节中的下三位相当于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) - 257个长度/字面量编码的5位数字(257-286)HDIST
(11101) - 1个距离编码的5位数字(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
我的问题
上面括号里的最后几位会被忽略吗?