前言
CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式。它通常应用在数据链路层的差错检测。在mac帧中,将原始数据处于除数(生成多项式)把得到的余数叫做FCS(帧校验序列FCS)加到mac帧的尾部。CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到原数据后面。当原数据传输时,当需要检测这个数据是否在传输中出错时,就用除数P进行想用的除数运算(通常为模2运算),如果余数0就接受,如果不为0丢弃。
常用的生成多项式(即算法中的除数,X1 就代表1号为有效位1,未给出的都为0):
CRC8=X8+X5+X4+X0
CRC-CCITT=X16+X12+X5+X0
CRC16=X16+X15+X2+X0
CRC12=X12+X11+X3+X2+X0
CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X0
eg: 位宽为4的多项式生成器生成FCS帧检验序列
CRC代码实现
short int crc16(unsigned char *addr, int num, short int crc)
{
int i;
for (; num > 0; num--) /* 1 个1个字节的读取数据 */
{
crc = crc ^ (*addr++ << 8); /* 从数据中读取一个字节,左移8位后,与16位的CRC异或*/
for (i = 0; i < 8; i++) /*对每一字节的数,模2运算进行8次*/
{
if (crc & 0x8000)
crc = (crc << 1) ^ POLY;
else
crc <<= 1;
}
crc &= 0xFFFF;
}
return(crc);
}