一片云雾

写博客挺浪费时间的……
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

无符号哥伦布编码的解码原理以及C++实现

Posted on 2011-12-26 09:57  一片云雾  阅读(1476)  评论(0编辑  收藏  举报

哥伦布编码的码字code_word由三部分组成:

code_word = [M个0] + [1] + [Info]

其中,Info是一个携带信息的M位数据,每个哥伦布码的长度为(2M+1)位,每个码字都可由code_num产生。

根据码字code_word解码出code_num值的过程如下:

  1. 首先读入M位以"1"为结尾的0
  2. 根据得到的M,读入接下来的MInfo数据;
  3. 根据这个公式得到计算结果code_num = Info – 1 + 2M

以上过程的C++实现代码如下:

 

/*******************************************************************************
* 函数名称: GetUeValue
* 功能描述: 从缓冲区解码无符号哥伦布编码值;
* 输入参数: pBuff -- 待解码的缓冲区;
* nLen -- 输入数据的字节长度;
* nStartBit -- 待解码数据相对输入缓冲区开头的起始bit位;
* 输出参数: nStartBit -- 该哥伦布编码值之后的第一个bit位;
* 返 回 值: 返回解码出的哥伦布编码值。
* 其它说明:
* 修改日期 修改人 修改内容
* ------------------------------------------------------------------------------
* 2010-07-19 雾影 创建
******************************************************************************
*/
UINT GetUeValue(BYTE *pBuff, UINT nLen, UINT &nStartBit)
{
//计算0bit的个数
UINT nZeroNum = 0;
while (nStartBit < nLen * 8)
{
if (pBuff[nStartBit / 8] & (0x80 >> (nStartBit % 8)))
{
break;
}
nZeroNum++;
nStartBit++;
}
nStartBit ++;

//计算结果
DWORD dwRet = 0;
for (UINT i=0; i<nZeroNum; i++)
{
dwRet <<= 1;
if (pBuff[nStartBit / 8] & (0x80 >> (nStartBit % 8)))
{
dwRet += 1;
}
nStartBit++;
}
return (1 << nZeroNum) - 1 + dwRet;
}