数据校验
场景:
受元器件质量、电路故障或者噪音干扰等因素的影响,计算机在对数据进行处理、传输以及存储过程中,往往会出现误差。为了发现或者纠正出现的错误,人们提出了基于编码的解决方案。基本思路就是按照某种规则编码,这样编码之后就会具有发现错误或指出错误位置的功能。
专用词:
码距:一组校验编码中任何两个编码之间不同代码的位数;
正误比(笔者自己定义):就是在某一编码规则当中正确状态和错误状态的比,比如4位二进制(0000~1111)可以表示16种状态,其中8种(0000,0011,0101,0110,1001,1010,1100,1111)是正确状态,其余为错误状态,这样当正确状态0000出错变成1000的时候就会发现错误,这种编码正误比是50%因为正确状态可以转成正确状态的几率为50%,所以错误被发现的可能性也是50%;这样可能还是不够明白,接下来就用具体的校验编码来说明;
映射规则(笔者自己定义):把需要校验的数据映射到某种校验编码规则状态集合(域)的某种规则(CRC中叫生产成 多项式);
原理图:
实例解析:
定义自己的名词完全是为了更明确的阐述自己的思路,如果上面几个名词还不是很清楚,在下面的实例讲解过程中就会明白。
简单奇偶校验:
映射规则:校验码中1的数量为奇数或者偶数;
比如被校验数据为:10110101,根据映射规则编码之后的校验码(奇校验)就是101101010,由于只加了一个冗余位,所以它的正误比是50%,也就是说他可以找出50%的错误;因为增加了1位,值域扩展了一倍,其中一半表示之前相同数量数据的正确状态,另一半表示错误状态。由于一半错误状态数量分别对应正确状态的数量所以简单奇偶校验不具备发现错误的能力(确切的说是具有发现一位不知位置错误的能力,见上图解释),想要具有发现错误的能力必须扩展错误状态的数量,也就是说让正误比小于50%;
海明校验:
映射规则:将有效信息按某种规律分成若干组(并不是均匀分组,而是按位号确定),每组安排一个校验位,做奇偶测试,就能提供多位检错信息,以指出最大可能是哪位出错,从而将其纠正。实质上,海明校验是一种多重校验。
分组原则:
在海明码中,
位号数(
1
、
2
、
3
、
……
、
n
)为
2
的权值的那些位,即:
1(20)、2(21)、4(22)、8(23)、…2r-1位,作为奇偶校验位
并记作
:P1
、
P2
、
P3
、
P4
、
…Pr
,余下各位则为有效信息位。
例如:
N=11 K=7 r=4
相应海明码可示意为
位号
1 2 3 4 5 6 7 8 9 10 11P
占位
P1 P2 × P3 × × × P4 × ×
其中
×
均为有效信息,海明码中的每一位分别被
P1P2P3P4… Pr
中的一至若干位所校验,其规律是:
第
i
位由校验位位号之和等于
i
的那些校验位所校验
如:海明码的位号为
3
,它被
P1P2
(位号分别为
1,2
)所校验
海明码的位号为
5
,它被
P1P3
(位号分别为
1,4
)所校验;
实例(采用偶校验):以4位有效信息(b1、b2、b3、b4)和3位校验位(P1、P2、P3)为例: K=4 r=3;
海明序号 1 2 3 4 5 6 7
海明码 P1 P2 b1 P3 b2 b3 b4
海明序号 1 2 3 4 5 6 7
海明码 P1 P2 b1 P3 b2 b3 b4
(1)每个小组只有一位校验位,第一组是P1、第二组是P2、第三组是P3。
(2)每个校验位校验着它本身和它后面的一些确定位。
(2)每个校验位校验着它本身和它后面的一些确定位。
1)若有效信息b1b2b3b4=1011 先将它们分别填入第3、5、6、7位
2)再分组进行奇偶统计,分别填入校验位P1、P2、P3的值
如:第一组有:P1b1b2b4 因b1b2b4含偶数个1,故P1应取值为0
第二组有:P2b1b3b4 因b1b3b4含奇数个1,故P2应取值为1
第三组有:P3b2b3b4 因b2b3b4含偶数个1,故P3应取值为0
海明编码为:P1P2b1P3b2b3b4=0110011;
2)再分组进行奇偶统计,分别填入校验位P1、P2、P3的值
如:第一组有:P1b1b2b4 因b1b2b4含偶数个1,故P1应取值为0
第二组有:P2b1b3b4 因b1b3b4含奇数个1,故P2应取值为1
第三组有:P3b2b3b4 因b2b3b4含偶数个1,故P3应取值为0
海明编码为:P1P2b1P3b2b3b4=0110011;
因为分三组校验,每组产生一位检错信息、3组共3位检错信息,便构成一个指误字,上例指误字由G1G2G3组成。
其中:
G3=P3⊕b2⊕b3⊕b4 P3b2b3b4=0011
G2=P2⊕b1⊕b3⊕b4 P2b1b3b4=1111
G1=P1⊕b1⊕b2⊕b4 P1b1b2b4=0101
其中:
G3=P3⊕b2⊕b3⊕b4 P3b2b3b4=0011
G2=P2⊕b1⊕b3⊕b4 P2b1b3b4=1111
G1=P1⊕b1⊕b2⊕b4 P1b1b2b4=0101
采用偶校验,在没有出错情况下G1G2G3=000。由于在分组时,就确定了每一位参加校验的组别,所以指误字能准确地指出错误所在位。 如:若第3位b1出错,由于b1参加了第一组和第二组的校验,必然破坏了第一组和第二组的偶性,从而使G1和G2为1。 因为b1未参加第三组校验,故G3=0,所以构成的指误字G3G2G1=011它指出第3位出错。反之:若G3G2G1=111 则说明海明码第7位b4出错。因为只有第7位b4参加了3个小组的校验,破坏了三个小组的偶性。
假定:
源部件发送海明码为:0110011 接收端接收海明码为:0110011, 则: 三个小组都满足偶校验要求,这时G3G2G1=000,表明收到信息正确,可以从中提出有效信息1011参与运算处理。纠错:若接收端收到的海明码为0110111,分组检测后指误字G3G2G1=101,它指出第5位出错,则只须将第5位变反,就可还原成正确的数码0110011。
假定:
源部件发送海明码为:0110011 接收端接收海明码为:0110011, 则: 三个小组都满足偶校验要求,这时G3G2G1=000,表明收到信息正确,可以从中提出有效信息1011参与运算处理。纠错:若接收端收到的海明码为0110111,分组检测后指误字G3G2G1=101,它指出第5位出错,则只须将第5位变反,就可还原成正确的数码0110011。
CRC循环冗余校验:
循环冗余是基于模2运算简历编码规则的校验码。CRC在磁盘存储器和通许方面应用很多;
模2运算
模2运算的加与模2运算的减结果一样,没有进位和借位,模2运算就是异或运算,符号表示
⊕,0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1);
模2运算最需要注意的就是除法运算。
循环冗余校验数学原理: