谁能把crc校验一步步算出来?
(1).预置16位寄存器为FFFFH。称此寄存器为CRC寄存器;
(2).把第一个8位数据与CRC寄存器的低位相异或,把结果放于CRC寄存器;
(3).把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
(4).如果最低位为0:重复第3步(再次移位)如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
(5).重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
(6).重复步骤2到步骤5,进行下一个8位数据的处理;
(7).最后得到的CRC寄存器即为CRC码。(CRC码 = CRC_L +CRC_H)
发送01 00 03 01 00 03的校验码应该是54 0B 可是我按照上面那个算法怎么也算不出来?求高人出手。要详细运算过程。
应该是1 3 0 1 0 3 的校验码是540b 展开
从(1)看,你已经考虑了算法要求的初值问题,从(3)看,你已经考虑了数据的排列问题,使用的是低位先传输低位先校验的方式,那还有两个问题:
计算步骤,从你的讲述上,你是先判断最低位为1,做异或,再移位,这个步骤不符合要求。应该是先判断最低位为1,先移位,再做异或;如果最低位为0,则移位,但不做异或。具体的原理一下说不清楚,我借花献佛,推荐你搜一下一个文档:“我学习CRC32、CRC16、CRC 原理和算法的总结(与WINRAR 结果一致)”,其中“三 直接计算法”可以解决你的问题,但建议你把之前的一二都看了,我前段时间做以太网的CRC32校验的时候被整的死去活来,最后发现这个文档讲得很有条理,虽然应用不同,但原理相同,感谢作者。
确定一下你最后的CRC码是否需要取反,因为很多传输用的算法,如果要对CRC校验码后的0的个数敏感,是需要对其CRC码取反的,你做完1后,如果结果还不对,可以试着取反试试。最后再确定一下算法要求的CRC码值的排放顺序,这个也会影响你最终结果的表现形式。
差点被你绕进去了,你的计算是使用的检查最低位,向右移的方式,那你的生成多项式是不是也已经相应的进行了翻转?将高低位按序反着放了?建议你还是找到你要做的这个算法的规范文本,确认一下规则。
这个算法是电力仪表说明书上给的?难道有误?我看过你说的那篇文章,不过跟我这个不一样,我还看了百度文库里面的好几个算法,我都搞晕了,是不是crc校验有好多种算法?
是的,比如说CRC8,CRC16,CRC32,CRC32里面好像WINRAR使用的和以太网的还不一样,我只做过以太网的,各自有自己的规则,但是基本原理都是一样的。区别可能不止是生成多项式的不同,还有数据的校验顺序,前后的码值取不取反,最后的校验值怎么排列等等,不过我觉得你好好看看那篇文章的一到三,应该基本也就能凑出来了,多试试也就差不多了,我当时把那篇文章中所有方法都实现了一遍。
2024-06-06 广告