原:http://hi.baidu.com/tengjz/blog/item/5f9c84d6b39c07d5a044df09.html
续上:(原来文章还有长度限制....)
生成规则是:同长度的码递增,如果长度变长1,那么将该次的码加1,然后左移一位。例如,长度为3的码有5个,其中第一个是010,那么递增依次是011 100 101 110,这时候长度为3的码结束,要进行长度为4的码,将110+1 = 111右移一位变成1110,这个就是4位码的第一个了。 2)解码过程 利用上述的编码规则,可以得到解码过程的伪代码如下: 逐位读入码流,然后判断是否小于该长度的范式Huffman编码,如果小于则得出编码长度,就可以得到Huffman编码,否则继续读入下一位,然后继续上述判断。 extren KBitInputStream bs; int len = 1; int code = bs.ReadBit(); while(code>=first[len]) { code<<=1; code& = (bs.ReadBit());//读取下一个bit len++; } len--;//至此,识别出了一个前缀码,下面将code解码为其对应的符号sym int index = index[len]+(code-first[len]); int sym = table[index];
first[i]表示长度为i的第一个Huffman编码的整数值 例如在上述的DC表中,first数组取值为{00, 100,1110,11110,1111110,1111110} 假设一个码流为1011101110,解码过程如下: 读入10>first[1],继续读入101>first[2],继续读入1011<1110,说明该码的长度为3,同时可以求出偏移量101-100=1,查表可以得到表示的符号是4。 |
转载于:https://blog.51cto.com/zdsfwy/849225