原: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