Tré*_*iel 2 c++ binary zlib deflate huffman-code
我对这个问题的希望(参见底部)希望对我的放气过程进行尽可能多的布置,并且我可以(可能非常)误解了我所在的领域。希望最后,这个问题可以成为一个方便的资源。
前两个字节等于zlib压缩的标头,格式为(credit)
---CMF--- ---FLG---
0111.1000 1101.0101
CINF -CM- +-||
| |+- FCHECK
| +-- FDICT
+---- FLEVEL
Run Code Online (Sandbox Code Playgroud)
从RFC 1950开始,从右到左:
FCHECK(1.0101)-验证CMF和FLG为16位无符号整数是31的倍数
FDICT(0)-如果设置,表示在FLG之后紧随其后的预设DICT
FLEVEL(11)-压缩“强度” [0-3]
CM(1000)-用于压缩方法,其中CM = 8 ==“放气”压缩方法
CINF(0111)-指示使用的滑动窗口的大小,其中CINF = 7 == 32K滑动窗口
NEW BYTE中的后三位等于霍夫曼编码块的标头:
---CMF--- ---FLG--- NEW BYTE
0111.1000 1101.0101 11101100
|-|
| +- BFINAL
+--- BTYPE
Run Code Online (Sandbox Code Playgroud)
从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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
由于HCLEN = 19,因此将使用整个序列
0该序列中的代码长度表示未使用相应的符号。
作为一个图形示例,读取19x3位后,我们有六个额外的位(括号中的额外位):
NXT BYTE 00000000 00000000 00000000 00000000 00000000 00000000 [000000](00
Run Code Online (Sandbox Code Playgroud)
上方括号中的最后几位会被丢弃吗?
不会。在deflate流中,您唯一跳过跳过位以到达字节边界的时间是针对已存储的块(00),或者是读取了最后一个块中的结束代码时。在代码长度代码长度的位之后,您继续后续的位,以使用生成的霍夫曼代码读取代码长度。