当前位置: 首页 > 科技观察

嵌入式算法的CRC校验算法

时间:2023-03-23 10:27:47 科技观察

错误在数据传输过程中是不可避免的。接收方接收到数据后,首先检查数据的准确性,对异常数据进行特殊处理。校验的方式有很多种,常用的是CRCCyclicRedundancyCheck。CRC算法具有很强的检错能力和较高的效率,是信息通信领域最常用的校验方法。CRC校验算法应用广泛,算法实现简单,但其背后纠错码的代数理论不是一般人能理解的。因此,在不了解循环检查原理的情况下,就贸然分析算法流程是不明智的。如果按照源码逆向执行过程,你会不明白为什么要这样执行?一般关注CRC都是面向应用的,为什么是CRC16算法,结果却不一样。这篇文章的目的就是这样。1、CRC定义假设要发送996这个数,除以7,余数为2,发送时,将996-2组合起来发送出去。接收方根据相同的操作判断数据包是否正确。相同的源数据,因不同的除数而产生不同的余数。CRC算法也是基于类似的原理。CRC算法中的参数解释如下:1.除法定义为模2除法。2.除数定义为多项式,如x^16+x^12+x^5+1(0x1021)2^16+2^12+2^5+2^0=65536+4096+32+1=69665=0x11021。根据不可描述的标准,多项式的最高位和最低位必须为1,所以一般简化为0x1021,忽略最高位,记录为Poly。3、由于多项式的长度不同,一般分为CRC8、CRC16和CRC32,因为模2除法简化为异或和移位运算,其初值为Init。4.RefIn三个参数:待测数据的每个字节是否位反转,TRUE或FALSE。RefOut:计算后异或输出前,整个数据是否位反转,TRUE或FALSE。XorOut:计算结果与该参数异或得到最终的CRC值。但是任何与0异或的数仍然是它自己,所以当值为0时,可以忽略不计。5.由于多项式Poly、初值等不同,CRC有不同的版本。理论上多项式是可以随意定义的,但是一般的标准多项式都是通过数学推导出来的,这样才能保证不同数据得到的CRC值尽可能不同。6、参考https://crccalc.com/的定义,不同的场景使用不同的多项式。2.CRC算法及模板通用版的CRC算法如下:CRC8//参考CRC-8/ITUunsignedcharCRC8(unsignedchar*data,unsignedintlen){unsignedchari;unsignedcharpoly=0x07;//对应中的Poly列thetableunsignedcharinit=0x00;//对应表中的Init列unsignedcharwChar=0;while(len--){wChar=*(data++);//RefIn为TRUE时执行,FALSE时删除//InvertUint8(&wChar,&wChar);init^=wChar;for(i=0;i<8;i++){if(init&0x80){init=(init<<1)^poly;}else{init=init<<1;}}}//RefOut为TRUE时执行,FALSE时删除//InvertUint8(&init,&init);//与XorOut异或,为0则执行与不执行没有区别init=init^0x55;return(init);}CRC16//带CRC-16/X-25的指的是unsignedshortCRC16(unsignedchar*data,unsignedintlen){unsignedchari;unsignedshortpoly=0x1021;//对应表中的Poly列unsignedshortinit=0xFFFF;//对应表中的init列unsignedcharwChar=0;while(len--){wChar=*(data++);//RefIn为TRUE时执行,FALSE时删除InvertUint8(&wChar,&wChar);init^=(wChar<<8);for(i=0;i<8;i++){if(init&0x8000){init=(init<<1)^poly;}else{init=init<<1;}}}//RefOut为TRUE时执行,FALSE时删除InvertUint16(&init,&init);//用XorOut进行异或,如果为0则执行与不执行没有区别init=init^0xFFFF;return(init);}CRC8和CRC16,根据不同版本参数差异,查表改将模板中的参数设置为对应的值,即可得到对应版本的CRC校验值。涉及数据取反的代码如下:voidInvertUint8(unsignedchar*DesBuf,unsignedchar*SrcBuf){inti;unsignedchartemp=0;for(i=0;i<8;i++){if(SrcBuf[0]&(1<

最新推荐
猜你喜欢