CRC算法的困惑
由于工作需要(^_^,java开发)最近在看PNG的文件格式,看到CRC算法,感觉比较有用,就找了找相关资料学习学习。
CRC码是一串2进制序列取余的结果,除数(或者叫多项式)不同,叫法不同,什么CRC-16,CRC-CCITT,CRC-32等等。
求CRC的大体意思是使用现有的CRC<<1,再加上本位的值(0或1),求出余数,就是当前的CRC。
( 以上是我的理解,不知道对不对,)
可是看到代码,却被 与或 糊涂了。
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned char i;
unsigned int crc=0;
while(len--!=0) {
for(i=0x80; i!=0; i/=2) {
if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;} /* 余式CRC 乘以2 再求CRC */
else crc*=2;
if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的CRC */
}
ptr++;
}
return(crc);
}
总结下代码的意思是,CRC(16位)的最高位和当前的数据位异或,为1的话,CRC左移1位后,会异或0x1021,否则0的话,只是移位。
与或不过是0x1021中1对应的位取反,0对应的位保留,为何和取余数产生关系,不解啊~~~困惑~~~~
哪位知道的,给些意见,点拨小弟一下,这里先谢过了~~~呵呵