您好,欢迎访问三七文档
CRC校验专题以CRC-16为例,说明CRC的计算过程:1.设置CRC寄存器,并给其赋值FFFF(hex)。2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。6.重复第2至第5步直到所有数据全部处理完成。7.最终CRC寄存器的内容即为CRC值。翻译:1.意思是首先寄存器中的值是11111111111111112.数据第一个字节一个字节=8位用二进制表示就是【00000000-11111111】之间用这个数值跟寄存器中的16个1中的后8位进行异或(异或不知道什么意思的自己查简单理解就是同为0异为1)然后把这个数值保存到寄存器中3.判断最后一位是否为0如果为0寄存器中的值向右移动一位前面补零如果为1拿寄存器中的值与多项式进行异或。4.检查当前寄存器中的最后一位如果是0重复第三步;如果是寄存器中的值与多项式进行异或5.重复3与4直到8此移位完成。6.重复第2到第五步知道正规数组的数据验证完成7.最终计算出的就是CRC的值实例:实例byte[]bufs=newbyte[]{0x2f,0x12,0x31}crc16多项式码假设是0x8408二进制形式就是10000100000010001crc=0xffff;用二进制表示就是11111111111111112拿出bufs中第一个字节0x2f二进制表示00101111跟寄存器中的后8位进行异或得到11111111110100003判断CRC寄存器中最后一位当前为0寄存器右移一位得到0111111111101000(如果为1就与多项式进行异或)4判断当前寄存器中的值当前最后一位为0所以重复第三步继续右移得到0011111111110100最后还是0在重复第三步0001111111111010最后还是0继续第三步0000111111111101这时最后一位为1了这时与多项式进行异或得到10111011111110015重复判断知道判断完8次6然后再重复第2到第5步直到上面数组中的bufs中三个字节验证完7最终寄存器中的值就是crc值下面进行实战C#code分析constuintPRESET_VALUE=0xFFFF;初始化寄存器的值constuintPOLYNOMIAL=0x8408;多项式码三个参数1char数组byte一样2.数组长度uintuiCrc16Cal(char[]pucY,intucX){uintucI,ucJ;uintuiCrcValue=PRESET_VALUE;赋除值for(ucI=0;ucIucX;ucI++){uiCrcValue=uiCrcValue^pucY[ucI];进行异或for(ucJ=0;ucJ8;ucJ++)由于一个字节8位所以判段8次{if((uiCrcValue&0x0001)!=0)(*1下面解释){uiCrcValue=(uiCrcValue1)^POLYNOMIAL;}(*2下面解释)else{uiCrcValue=(uiCrcValue1);}(*3下面解释)}}returnuiCrcValue;}*1“&”这个符号在C、C#等语言上是按位与即按二进制比对1与1得10与1得00与0得0例如:比如:10010001(二进制)&11110000等于10010000(二进制)。0x0001就相当于只判断最后一位(仔细思考)*2“”这个符号是右移符号“^”这个符号是异或符号即1异或0等于1,0异或0等于0。即:相同得0,相异得1*3“”移位上面有解释讲到这种程度你们再不明白就不科学了!直接拿去打印完让张永军给你们讲去吧
本文标题:crc校验详解
链接地址:https://www.777doc.com/doc-1616904 .html