哥伦布编码的码字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; }
|