CRC校验与ChekSum
一、CRC校验
循环冗余校验码(CRC)的技术原理 - 知乎 (zhihu.com)
(14条消息) 循环冗余校验码(计算机组成原理12)_计算机组成原理 循环冗余是什么_阿芒Aris的博客-CSDN博客
(先把大佬的文章拿出来)
1.简单描述
在数据传输过程中,很难实现无差错传输。差错传输导致接收方收到的数据发生错误。为尽量提高接收数据的正确率,在接收数据之前需要对数据进行差错检测。
CRC是一种用于校验通信链路上数字传输准确性的计算方法。其原理是附加在数据序列之后的检验码与数据序列的内容之间存在着某种特定的关系,如果数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏,由于CRC检错能力极强,且检测成本较低,成为数据通信领域最为普遍的校验方式。
2.循环冗余校验码的基本思想
- 数据发送和数据接收方约定一个“除数”;
- K个信息位+R个校验位作为“被除数”,添加校验位后需保证出发的余数为0;
- 收到数据后,进行处罚检查余数是否为0;
- 若余数非0说明出错,则进行重传或纠错;
一个超级详细的模2例子
(14条消息) 计网—CRC编码—模二除法的超详细过程_比特序列怎么求_牧野如烟的博客-CSDN博客
3.除数的计算(多项式)
设生成多项式为,信息码为101001,因为x的1次方为0,所以得除数1101。
(14条消息) CRC 循环冗余检验【计网必考】_crc除数怎么确定_栈老师不回家的博客-CSDN博客
4.被除数的计算
已知信息码101001,因为多项式最高幂次为3次,所以在信息码后添3个0,得被除数101001000,我也不知道为什么,好像是为了避免向上借1弄出来的操作。
5.构造方法
1》确定K、R以及生成多项式对应的二进制码
K = 信息码长度 = 6,R = 生成多项式最高次幂 = 3 则校验码位数为 N = K+R = 9
生成多项式G对应的二进制码为1101,对应x次幂的系数
2》移位
信息码左移R位,低位补0(即在信息码后补R个校验位的0)
3》相除
对移位后的信息码,用生成多项式进行模2除法,产生余数
对应的CRC码:101001 001
(相除过程见上图,其模2除法的余数 001 就是校验位)
4》检错和纠错
发送方发送的数据为101001001记为
接收方对接收的数据用约定好的1101进行模2除,若余数为000,代表没有出错;若余数为010,代表或
出错,其余数和出错位对应关系如下图

这个图里的余数和出错位的推算:001=1;010=2;=100=3,转化为十进制(余数二进制,出错位十进制)
6.纠错检错
注意在上表中,出错位为1和8、2和9的余数两两相同,那么我们能推知循环冗余校验码只有检错的能力,而没有纠错的能力么?
也不全对,因为在上述例子中,余数只有3位二进制码,只能表示8-1=7种(000表示没出错)出错位,但传输的位数为9位,故无法纠错。

对于确定的生成多项式,出错位与余数是相对应的
即如果出错的位数并没超过余数所能表示的范围,则余数和出错位之间就是一一对应的关系
K个信息位,R个校验位,若生成多项式选择得当,且则CRC码可纠错
(14条消息) 循环冗余校验码(计算机组成原理12)_计算机组成原理 循环冗余是什么_阿芒Aris的博客-CSDN博客
二、checksum
(15条消息) checksum算法详细的计算方法、实现思路与python校验验证_checksum校验和算法_yiyayiya980624的博客-CSDN博客
1.checksum是什么?
Checksum:【电脑】总和检验码,校验和。在数据处理和数据通信领域中,用于校验目的的一组数据项的和。这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串。
它通常是以十六进制为数制表示的形式
通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性
2.计算方法
1、 先将需要计算checksum数据中的checksum设为0;
2、 计算checksum的数据按2byte划分开来,每2byte组成一个16bit的值,如果最后有单个byte的数据,补一个byte的0组成2byte;
3、 将所有的16bit值累加到一个32bit的值中;
4、 将32bit值的高16bit与低16bit相加到一个新的32bit值中,若新的32bit值大于0Xffff,
再将新值的高16bit与低16bit相加;
5、 将上一步计算所得的16bit值按位取反(取反是取补码),即得到checksum值,存入数据的checksum字段即可。
3.算法实现的具体思路
参考的别的大佬的文章,数据拿过来
45 00 00 30 80 4c 40 00 80 06 b5 2e d3 43 11 7b cb 51 15 3d
1、第一步,checksum数据中的checksum=b52e设为0
遍历需要校验的数据,将checksum替换为0
45 00 00 30 80 4c 40 00 80 06 00 00 d3 43 11 7b cb 51 15 3d
2、第二步,求和
遍历求和,直接累加,最后输出的是一个int类型的十进制数
3、第三步,转十六进制,将进位添加到低位
python提供了直接将十进制数转为十六进制的内置函数:hex() 返回的是str型 例如:hex(12345)
4500+0030+804c+4000+8006+0000+d343+117b+cb51+153d=0x34ace
将进位(3)加到低16位(4ace)上:0003+4ace=4ad1
4、第四步,取反码
将4ad1取反得:checksum=b52e
4、按位取反
(15条消息) 按位取反运算,简短精炼_按位取反怎么算_吃火锅的腿腿的博客-CSDN博客
先将16进制转化为2进制,正数的话然后倒过来就完事了。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
