/****************************************** CRC12校验函数 输 入: ptr需要进行校验的数据包首地址 len需要校验的数据包字节数 输 出: 校验码; 调 用: 无; 被调用: 从机协议打包函数; 功 能: 将一给定的数据包进行CRC12校验给调用者返回校验码 ******************************************/
unsigned int CRC12(unsigned char *ptr,unsigned char len) { unsigned char i; unsigned char j; j = 0;
while(len) { /*多项式除法*/ if(*ptr & (0x80>>j)) //如果该位为1 crc |= 0x01; //则在余数尾部添1否则添0 if(crc >= 0x1000) crc ^= 0x180D; crc <<= 1; j++; if(j == 8) { j = 0; ptr++; len--; } } /*对后面添加的12个0做处理*/ for(i=0; i<12; i++) { if(crc >= 0x1000) crc ^= 0x180D; crc <<= 1; } crc >>= 1; return(crc); }
就是这个程序 前面的我都可以看懂,就是倒数第一行的程序crc >>= 1; 为什么最后要把crc向右移动一位呢?这样除以2的意思是什么呢? |