缩小压缩规范说明

时间:2015-11-05 01:57:23

标签: c++ binary zlib huffman-code deflate

我对这个问题的希望(参见:下图)就是我所知道的关于放气过程的内容,我可以接受有关我(可能非常)误导的领域的更正。希望在最后,这个问题可以成为一个方便的资源。

Zlib标题

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

---CMF---  ---FLG---
0111.1000  1101.0101
CINF -CM-  +-||
           | |+- FCHECK
           | +-- FDICT
           +---- FLEVEL

RFC 1950,从右到左:

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

  2. 的倍数
  3. FDICT(0) - 如果设置,则表示在FLG之后立即预设DICT

  4. FLEVEL(11) - 压缩"强度" [0-3]

  5. CM(1000) - 用于压缩方法,其中CM = 8 ==" deflate"压缩方法

  6. CINF(0111) - 表示使用的滑动窗口的大小,其中CINF = 7 = = 32K滑动窗口

  7. 数据块标题

    NEW BYTE中的后三位等同于Huffman编码块的标题:

    ---CMF---  ---FLG---  NEW BYTE
    0111.1000  1101.0101  11101100
                               |-|
                               | +- BFINAL
                               +--- BTYPE
    

    RFC 1951从右到左:

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

    2. BTYPE(10) - 霍夫曼编码:(00)无; (01)固定霍夫曼码; (10)动态代码; (11)无效

    3. 霍夫曼代码

      从这里开始,我将假设BTYPE =(10)

      以下值立即继续:

      NEW BYTE                NXT BYTE                  
      (11101)100       ->     101)(11101)   ->   0111111(1
             |-|
             | +- BFINAL
             +--- BTYPE
      
      1. HLIT(11101) - 5位长度/文字代码,257添加(257-286)

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

      3. HCLEN(1111) - 4位代码长度代码,4添加(4-19)

      4. 紧随其后的是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
        

        我的问题

        上面括号中的最后几位被扔掉了吗?

1 个答案:

答案 0 :(得分:4)

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