-
什么是CRC算法?
CRC(Cyclic Redundancy Check),称循环冗余校验,是根据数据产生简短固定位数校验码的一种信道编码技术,主要用于发送端和接收端检测或校验数据传输前后是否出现错误,它是利用除法及余数的原理来作数据错误侦测的。 -
CRC数据格式
一个完整的数据帧通常由以下部分构成:帧头+数据+校验数据+帧尾
在实际应用中,我们通常只关心 数据+校验数据,即校验数据一般是附加在数据后一起传输,所以数据传输流程如下:
发送端以CRC算法计算出校验数据crcData
发送端将crcData合并到数据data中得到一帧数据data+crcData,发送给接收端
接收端收到data+crcData数据帧后以CRC算法验证crcData的正确性,以检测数据是否出错 -
CRC算法参数模型解释
-
示例(CRC-8/MAXIM算法):
设原始数据为0xD6
(1)原始数据为0xD6,转成二进制为1101 0110,多项式由上图知为x^8+x^5+x^4+1=0x131(可以理解为x=2),上图中的多项式是0x31,去掉了最高位,
至于为啥去掉目前没搞明白,多项式为啥要多1个bit、多项式能不能自己随意定,这些专业知识还得找文献再看看,不过能算出来校验和就OK。
(2)输入反转为true,这里是指高低位顺序反转,例如1000 1000反转后为0001 0001,所以我们要把异或
后的数据0xD6即1101 0110进行反转得到0110 1011即0x6B。
(3)用反转后数据高8位和上图中初始值进行异或运算:0x6B^0x00=0x6B,还是原始数据;初始值可以随意设置,至于为啥是和高8位而不是低8位,也不明白。
(4)规定要在原始数据后补(多项式位数-1)个0,因为多项式为0x131有9个位,所以我们要在0x63后补9-1=8个0,结果为0x6B00,为啥这么规定,也不明白。
(5)把反转后的数据与多项式进行模2除法,其实就是异或运算,我们需要的是运算结果的余数,所以我们要把0x6B00与多项式0x131不断异或,直到余数
位小于等于多项式位数;如果余数位等于多项式位数,那么把它俩异或后的结果就是最终运算结果;如果余数位小于多项式位数,那么余数直接就是
最终运算结果。0x6B00(hex)=0110 1011 0000 0000(bin),去掉高位没用的0结果为*</