你能在浪费时间中获得乐趣,就不是浪费时间。
——罗素
首先先了解
先说说什么是数据校验。数据在传输过程(比如通过网线在两台计算机间传文件)中,由于传输信道的原因,可能会有误码现象(比如说发送数字5但接收方收到的却是6),如何发现误码呢?方法是发送额外的数据让接收方校验是否正确,这就是数据校验。最容易想到的校验方法是和校验,就是将传送的数据(按字节方式)加起来计算出数据的总和,并将总和传给接收方,接收方收到数据后也计算总和,并与收到的总和比较看是否相同。如果传输中出现误码,那么总和一般不会相同,从而知道有误码产生,可以让发送方再发送一遍数据。
一 概念
CRC(Cyclic Redundancy Check),即循环冗余校验,是一种根据网络数据包或电脑文件等数据产生简短固定位数校核码的快速算法,主要用来检测或校核数据传输或者保存后可能出现的错误(检查数据传输是否错误滴)。
它比奇偶校验精确,并且占空间小,所以现在很受欢迎的。
简单原理——好吧,我说通俗一点吧:它就是在原来数据序列后面再加了一个随机位数的二进制校验码,然后把新的数据序列发送给接收端,如果接收端收到的数据能被一起约定的数 整除,则表示数据没有问题,否则数据有问题。
当然啦,最最重要的就是这个二进制校验码,它不是顺便的,那怎么来的呢(简单介绍)——首先基于一个多项式得到一个除数,然后再在原数据后加零(几阶多项式加几个),然后用模二运算计算出校验码,最好加在原数据序列后即可发送了。
二 多项式介绍
CRC多项式就是是为了生成一个除数,这个除数是模二运算的除数。
第一步:展开多项式,得到除数(参照常用的CRC多项式模型)
例如多项x4+x2+x+1 ,即 1x4+0x3+1x2+1x+1x0
得到除数:10111
例如多项式(手算)
看展开多项式的系数就可以啦!
是在实际应用中,有多种标准的CRC生成多项式被广泛使用,如CRC-12、CRC-16、CRC-32等,它们的生成多项式和对应的二进制表示在相关标准中均有规定,例如CRC-16的生成多项式为x^16 + x^15 + x^2 + 1,对应二进制表示为0x8005。这些生成多项式的选择经过了严格的数学分析和试验,以确保其检错性能。
三 模2除法
模2加减法
需要先了解模2加减法,究其根本其实是按位进行异或操作。就是二进制的加减法(满二进一嘛),十进制9±9=0,一样滴。
模2加减法
(按位异或操作,相同则0,不同则1)
0 ± 0 = 0
1 ± 1 = 0
0 ± 1 = 1
1 ± 0 = 1
例子:1011 ± 1000
计算过程:
1 0 1 1
± 1 0 0 0
------------
0 0 1 1
结果:1011 ± 1000 = 0011
模二除法就是二进制的除法(与十进制除法差不多),其实也就是异或运算。运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)。很好理解,两个相同的就为0,两个一样的就为1。
下面举了一个例子:
四 运算过程
上面介绍了多项式确定除数,以及二进制除法,那么接下来就可以介绍运算过程了。
比如:
原数据1011010
*确定多项式:X4+X3+1 ,由多项式来展开来确定除数为11001
*在原数据后面加零,确定被除数,最高次为几次就加几个零,这里是4次,加四个零,为10110100000
*在用新的数据110010000除以11001(模二运算)
(注意,除数要与被除数的最左边1对齐,然后同为0,异为1)
最后得到余数,最终校验码——1000
*把余数加到原来数据的末尾,(注意余数与之前加的零位数一样,也就是说余数位数与最高次方一样),这里是四位,从右向左取四位,余数也为四位,发送的数据为10110101000
五 接收端验证
来验证发送过来的数据是否正确,就把发送过来的数据取余
我们约定了二项式X4+X3+1 ,除数就是11001
计算
结果刚好为零,说明数据传输过程中没有出错,如果有余数则判定数据传输过程总出错啦!
六 结论
从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。能够对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
但是它只可以检错,并不可以纠错。
好啦,分享就到这里啦,我也是弄了很久才搞明白的😭,希望对大家有帮助!