GZIP压缩原理分析(19)——第五章 Deflate算法详解(五10) 算法分析(04) 格式说明(03) 静态哈夫曼编码

静态哈夫曼编码(Compression with fixed Huffman codes ),这部分内容只要看格式就好,出现在这里的码表只是为了说明,细节此时可能不懂,但是后面会铺开来讲,不用担心。

 

静态哈夫曼编码使用一张固定的literal/length码表,码表如下,

                  Lit Value                Bits                     Codes

                  ---------                 ----                      -----

                    0 - 143                   8                        00110000   through 10111111

                  144 - 255                 9                        110010000 through 111111111

                  256 - 279                 7                        0000000     through 0010111

                  280 - 287                 8                        11000000   through 11000111

Lit Value代表literal/length值,0-255是ASCII码,256-287代表另外的含义,后面再介绍,286和287永远不会用到;Bits是码字长度,Codes就是对应的码字。

 

静态哈夫曼编码还使用一张固定的distance码表,直接用5bits(五比特)对0-31这三十二个数编码,扩展位的编码方式与动态哈夫曼编码中的distance表相同,该表会在下面讲动态哈夫曼编码的时候给出。

 

由于使用静态哈夫曼编码的码表是固定的,所以每块使用静态哈夫曼编码的压缩块只有块首部,而没有类似存储方式(store)那样的专门的格式。块首部后面紧跟着就是经过静态哈夫曼编码的二进制码流,即比特流。由于块首部后面就是二进制码流,所以不会出现上面存储类型中为了补齐一个字节而浪费几比特的情况。例如,

上图所示是对原始文件fix_huffman.txt进行gzip压缩之后的结果,文件内容为“aaaaaaaaaaaaaaaaa”,剥掉gzip头和尾之后,deflate压缩数据以(00000010h,3)开头,以(00000010h,6)结尾。(00000010h,3)处的数据为“0x4B”,转换为二进制就是“01001011”,第二个字节“0x44”转换为二进制就是“0100 0100”。

 

先分析“0100 1011”。从右往左读,1表示这是最后一个压缩块;再往左读两位,是BTYPE,BTYPE内部不能从右往左读,就是实实在在的二进制“01”,代表静态哈夫曼编码。现在块首部已经读完,再往左读就是实际的压缩比特流了。将“0100 1”从右往左读作“1 0010”。

 

再分析“0100 0100”,由于已经读完块首部,那么这个字节就是实际压缩比特流的一部分,所以将其从右往左读作“0010 0010”。拼上上一个字节的那五位(五比特),我们现在分析的这部分比特流就是“1 00100010 0010”,对照静态哈夫曼编码的literal/length码表(为什么要对照这张码表而不是那张固定的distance码表,看到后面就知道了,这里暂且不表),发现从左往右的8bits(八比特),即“1 0010001”,就是字符a在该表中的码字!!!后面的比特流就不解码了,之后还会有更详尽的例子。

 

总结,静态哈夫曼编码的格式就是:块首部 + 经过编码的比特流。

 

你可能感兴趣的:(GZIP压缩)