使用静态霍夫曼代码进行DEFLATE编码

Few*_*ewG 3 zip encoding deflate huffman-code

需要一些帮助才能理解DEFLATE编码的工作原理.我知道这是LZSS算法和霍夫曼编码的组合.

所以让编码例如"Deflate late".参数:[搜索缓冲区:8kb和前瞻缓冲区4kb]嗯,LZSS算法的输出是"Deflate <5,4>"下一步使用静态霍夫曼编码来减少冗余.这是我的问题,我不知道如何用霍夫曼编码这对<5,4>.


将帖子

D 000
f 001
l 010
a 011
t 100
_ 101
e 11

好吧,根据这个表,字符串"Deflate"写成000 11 001 010 011 100 11 101.下一步是编码对(5,4).根据书"数据压缩 - 完整参考"的长度为4的固定前缀码是258,接着是距离5的固定前缀码(码4 + 1额外比特).

这可以概括为:

长度4 - > 258 - > 0000010
距离5 - > 4 + 1额外位 - > 00100 | 0

因此,编码的字符串被写为[header:1 01] 000 11 001 010 011 100 11 101 0000010 001000 [block-of-block:0000000],但是如果我创建一个huffman树,它不再是静态的huffman,对?

美好的一天

Mar*_*ler 13

D 000
f 001
l 010
a 011
t 100
_ 101
e 11
Run Code Online (Sandbox Code Playgroud)

不是Deflate静态代码.静态文字/长度代码均为7,8或9位,距离代码均为5位.你问过静态代码.

'deflate late'以静态deflate格式编码为文字'Deflate',长度为4,距离5匹配为十六进制:

73 49 4d cb 49 2c 49 55 00 11 00
Run Code Online (Sandbox Code Playgroud)

这可以分解如下(首先从每个字节的最低有效部分读取位):

011 - 01 means fixed code, 1 means last block
00101110 - D
10101001 - e
01101001 - f
00111001 - l
10001001 - a
00100101 - t
10101001 - e
00001010 - space
0100000 - length 4
00100 - distance 5 or 6 depending on one extra bit
0 - extra bit -> distance 5
0000000 - end code
0 - fill bit to byte boundary
Run Code Online (Sandbox Code Playgroud)

  • 阅读RFC 1951,第3.2.6节.D = 0x44.添加0x30以获得0x74.反转位并得到00101110. e = 0x65.添加0x30以获得0x95.反转位并获得10101001. (4认同)
  • RFC非常令人困惑,并且用十进制而不是二进制半烘焙表,并且没有清楚地解释表的派生方式。您从哪里获得0x30?它总是+ 0x30,还是基于您要添加的值?为什么要反转位?您是否知道其他任何资源(除了RFC之外)都提供膨胀数据压缩的清晰示例,并说明了固定表为何如此? (2认同)