//cRctable_16 表由函数 mK_cRctable 生成
nLength--;
pData++;
}
return cRc_16;
}
void mK_cRctable(unsigned short gEnpoly)
//函数功能:生成 0-255 对应的 16CRC 校验码,其实就是计算机算法 1(比特型算法)
//gEnpoly 为生成多项式
//注意,低位先传送时,生成多项式应反转(低位与高位互换)。如 CRC16-CCITT 为
0x1021,反转后为 0x8408
{
unsigned short cRc_16=0;
unsigned short i,j,k;
for(i=0,k=0;i<256;i++,k++)
{
cRc_16 = i<<8;
for(j=8;j>0;j--)
{
if(cRc_16&0x8000) //反转时 cRc_16&0x0001
cRc_16=(cRc_16<<=1)^gEnpoly; //反转时
cRc_16=(cRc_16>>=1)^gEnpoly
else
cRc_16<<=1; //反转时 cRc_16>>=1
}
cRctable_16[k] = cRc_16;
}
}
这几天研究了一下 CRC 算法,碰到了一些问题,研究了一下,小有心得。
CRC 算法是在通讯领域广泛采用的校验算法。原理我就不说了,这里说一
下简单的程序实现。以下均采用 CRC 多项式为 0x1021 即:
g(x) = x16+x12+x5+x0;CRC 的基本原理就不说了,那个搜一下就有了。
最基本的算法应该是按位计算了,这个方法可以适用于所有长度的数据校
验,最为灵活,但由于是按位计算,其效率并不是最优,只适用于对速度不敏
感的场合。基本的算法如下:
unsigned short do_crc_16(unsigned char *message, unsigned int
len)
{
int i, j;