首页 文章

缩小压缩规范说明

提问于
浏览
2

我对这个问题的希望(见:底部)就是我所知道的关于放气过程的内容,我可以得到关于我(可能非常)误导的领域的更正 . 希望在最后,这个问题可能是一个方便的资源 .

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 回答

  • 4

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

相关问题