读书人

关于CRC的原理与代码婚配

发布时间: 2012-10-18 13:46:56 作者: rapoo

关于CRC的原理与代码匹配
CRC的计算有多种方法,基本原理就是在待计算的源串后加上多项式位宽长度的0
比如:待计算的源串为1101 0010 1100 1001,多项式为1101,其位宽为3,
我们用1101 0010 1100 1001 000除以1101所得的余数就是我们想要的CRC值,在进行除法时,实际是异或运算。
也就是我们不停的进行异或,移位就可以得出CRC值。

下面这一段代码是计算CRC16的,多项式为0x1021,这段代码是没有问题,我用查表法计算相同的源串,得出的CRC值
是一样的,我敢保证查表法是正确的。对于这段代码,根据原理,我有几个疑问,希望大伙帮忙分析下,也希望大伙能
对这段代码和原理进行对照解读。
uint crc16l(uCHAR *ptr,uCHAR len) // ptr 为数据指针,len 为数据长度
{
uCHAR i;
while(len--)
{
for(i=0x80; i!=0; i>>=1)
{
if((crc&0x8000)!=0) {crc<<=1; crc^=0x1021;}
else crc<<=1;
if((*ptr&i)!=0) crc^=0x1021;
}
ptr++;
}
return(crc);
}

问题:
1,既然是在源串的后面补上与多项式位宽相同的0,这段代码在哪里体现出来的?我们给定计算的字符串是没有加多项式位宽个0的。
2,ptr是给定的源串,这个函数里只有“if((*ptr&i)!=0)”用到了源串,而且还是一个判断,也就是说源串并没有参与CRC的计算,而原理说得很明确,用源串去除多项式,这个该如何解释?

另外的问题:
对于查表法,这里只以CRC16讨论,为什么计算出的表是256项?查表法的依据是什么,就是查表法的原理?
在网上找了一些资料,但是没有找到自己想要的答案,希望大家能够给予解答,把CRC彻底整明白。

我的分不多,但是还是希望大家能积极参与,搞定CRC。谢谢了^_^

[解决办法]
函数里面crc的初值是?
[解决办法]
http://wissup.download.csdn.net/,这里有下载的pdf文档,推荐LZ看看!介绍了程序怎么来的!

读书人网 >C语言

热点推荐