1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
注意:该步检查LSB应该是右移前的LSB,即第3步前的LSB。
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。
----摘自百科
code:
#include <stdio.h>
#define PLOY 0xa001 //0x8005反转
unsigned short crc16(char *data,int size)
{
unsigned short crc = 0xffff;
int flag;
int i = 0;
int j = 0;
char data_t ;
if(data ==NULL){
return 0;
}
for(j=0;j<size;j++){
data_t = *data++;
crc = (data_t ^ (crc));
for(i=0;i<8;i++){
if((crc&0x1)==1){
crc = (crc>>1) ^ PLOY;
}else{
crc >>= 1;
}
}
}
return crc;
}
int main(int argc,char **argv)
{
char a[]={1,2,3,4,5,6};
printf("%x\n",crc16(a,sizeof(a)/sizeof(char)));
return 0;
}