压缩压缩规范说明

Tré*_*iel 2 c++ binary zlib deflate huffman-code

我对这个问题的希望(参见底部)希望对我的放气过程进行尽可能多的布置,并且我可以(可能非常)误解了我所在的领域。希望最后,这个问题可以成为一个方便的资源。

Zlib标头

前两个字节等于zlib压缩的标头,格式为(credit

---CMF---  ---FLG---
0111.1000  1101.0101
CINF -CM-  +-||
           | |+- FCHECK
           | +-- FDICT
           +---- FLEVEL
Run Code Online (Sandbox Code Playgroud)

RFC 1950开始,从右到左:

  1. FCHECK(1.0101)-验证CMF和FLG为16位无符号整数是31的倍数

  2. FDICT(0)-如果设置,表示在FLG之后紧随其后的预设DICT

  3. FLEVEL(11)-压缩“强度” [0-3]

  4. CM(1000)-用于压缩方法,其中CM = 8 ==“放气”压缩方法

  5. 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右到左:

  1. BFINAL(0)-如果这是最后一个数据块,则设置为(1)

  2. 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)
  1. HLIT (11101)-5位长度/文字代码,增加了257个(257-286)

  2. HDIST (11101)-5位距离代码,增加了1个(1-32)

  3. 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)

我的问题

上方括号中的最后几位会被丢弃吗?

Mar*_*ler 5

不会。在deflate流中,您唯一跳过跳过位以到达字节边界的时间是针对已存储的块(00),或者是读取了最后一个块中的结束代码时。在代码长度代码长度的位之后,您继续后续的位,以使用生成的霍夫曼代码读取代码长度。