谁能把crc校验一步步算出来

谁能把crc校验一步步算出来,第1张

从(1)看,你已经考虑了算法要求的初值问题,从(3)看,你已经考虑了数据的排列问题,使用的是低位先传输低位先校验的方式,那还有两个问题:

计算步骤,从你的讲述上,你是先判断最低位为1,做异或,再移位,这个步骤不符合要求。应该是先判断最低位为1,先移位,再做异或;如果最低位为0,则移位,但不做异或。具体的原理一下说不清楚,我借花献佛,推荐你搜一下一个文档:“我学习CRC32、CRC16、CRC 原理和算法的总结(与WINRAR 结果一致)”,其中“三 直接计算法”可以解决你的问题,但建议你把之前的一二都看了,我前段时间做以太网的CRC32校验的时候被整的死去活来,最后发现这个文档讲得很有条理,虽然应用不同,但原理相同,感谢作者。

确定一下你最后的CRC码是否需要取反,因为很多传输用的算法,如果要对CRC校验码后的0的个数敏感,是需要对其CRC码取反的,你做完1后,如果结果还不对,可以试着取反试试。最后再确定一下算法要求的CRC码值的排放顺序,这个也会影响你最终结果的表现形式。

差点被你绕进去了,你的计算是使用的检查最低位,向右移的方式,那你的生成多项式是不是也已经相应的进行了翻转?将高低位按序反着放了?建议你还是找到你要做的这个算法的规范文本,确认一下规则。

楼主程序中调用函数cal_crc()的方式不正确。函数cal_crc()用于计算输入串的校验码,因此函数输入参数包含输入串及该串的长度。

建议将main()函数修改为:

#include <stringh>

void main()

{

unsigned char buf[] = "ABCDEFG1234567"; // 输入串

unsigned char len = 14; // 输入串的长度

unsigned int crc;

crc = cal_crc(buf, len);

}

最后需要注意的是,输入串的长度不能大于256个字节。上述例子程序中假定了输入串为字符串,实际上,还可以是字节串,此时变量len表示字节串的包含的字节个数。

生成多项式P(X)=X5+X2+1,则除数为100101,冗余校验位数为(6-1)=5位;

根据CRC校验原理,由信息M位后面添加5个0,除以100101,得到的5位余数即为所求的校验位

计算 1010 1100 1000 1111 0000 0 MOD 100101

得余数为 010011

所以,校验位为:010011

在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。CRC计算方法是:1、 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。2、 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该CRC寄存器中。3、 把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。4、 如果移出位为零,则重复第三步(再次右移一位);如果移出位为1,CRC寄存器与0XA001进行异或。5、 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。6、 重复步骤2和5,进行通讯信息帧下一个字节的处理。7、 将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换8、 最后得到的CRC寄存器内容即为:CRC校验码。

你就是想要CRC8-CCITT的代码,这个到处都是。

>

以上就是关于谁能把crc校验一步步算出来全部的内容,包括:谁能把crc校验一步步算出来、大侠给我个完整的crc 程序 用C语言实现的,能在PC机上运行的。我马上拿出100分。。。、【计算机组成原理】如何计算CRC校验位等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10623697.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存