WEB开发网
开发学院软件开发VC 简单快速的哈夫曼编码 阅读

简单快速的哈夫曼编码

 2007-03-15 21:47:36 来源:WEB开发网   
核心提示: 接着,压缩的最后一步是将每个ASCII编码写入输出缓冲区中:int nDesIndex = 0;// loop to write codesfor(nCount = 0; nCount < nSrcLen; nCount++){*(DWORD*)(pDesPtr+(nDesIndex

接着,压缩的最后一步是将每个ASCII编码写入输出缓冲区中:int nDesIndex = 0;
// loop to write codes
for(nCount = 0; nCount < nSrcLen; nCount++)
{
    *(DWORD*)(pDesPtr+(nDesIndex>>3)) |=
         nodes[pSrc[nCount]].dwCode << (nDesIndex&7);
    nDesIndex += nodes[pSrc[nCount]].nCodeLength;
}

  • (nDesIndex>>3): >>3 以8位为界限右移后到达右边字节的前面
  • (nDesIndex&7): &7 得到最高位.
  • 注意:在压缩缓冲区中,我们必须保存哈夫曼树的节点以及位序列,这样我们才能在解压缩时重新构造哈夫曼树(只需保存ASCII值和对应的位序列)。

    解压缩

    解压缩比构造哈夫曼树要简单的多,将输入缓冲区中的每个编码用对应的ASCII码逐个替换就可以了。只要记住,这里的输入缓冲区是一个包含每个ASCII值的编码的位流。因此,为了用ASCII值替换编码,我们必须用位流搜索哈夫曼树,直到发现一个叶节点,然后将它的ASCII值添加到输出缓冲区中:

    int nDesIndex = 0;
    DWORD nCode;
    while(nDesIndex < nDesLen)
    {
        nCode = (*(DWORD*)(pSrc+(nSrcIndex>>3)))>>(nSrcIndex&7);
        pNode = pRoot;
        while(pNode->pLeft)
        {
          pNode = (nCode&1) ? pNode->pRight : pNode->pLeft;
          nCode >>= 1;
          nSrcIndex++;
        }
        pDes[nDesIndex++] = pNode->byAscii;
    }
  • (nDesIndex>>3): >>3 以8位为界限右移后到达右边字节的前面
  • (nDesIndex&7): &7 得到最高位.
  • 源文件: Huffman.cpp Huffman.h 请见本文提供的源代码压缩包。

    上一页  1 2 

    Tags:简单快速 哈夫曼 编码

    编辑录入:爽爽 [复制链接] [打 印]
    赞助商链接