哥伦布编码的码字code_word由三部分组成:
code_word = [M个0] + [1] + [Info]
其中,Info是一个携带信息的M位数据,每个哥伦布码的长度为(2M+1)位,每个码字都可由code_num产生。
根据码字code_word解码出code_num值的过程如下:
-
首先读入M位以"1"为结尾的0;
-
根据得到的M,读入接下来的M位Info数据;
-
根据这个公式得到计算结果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;
}