计算机系统在运行时,各个部件之间要进行数据交换,为了确保数据在传送过程中正确无误,通常使用校验码的方法来检测传送的数据是否出错。合理的设计错误编码以及编码规则,舍得数据在传送中出现某种错误时会变成错误编码,这样就可以检测出接收到的数据是否有错。
通常是一组数字的最后一位,由前面的数字通过某种运算得出,用以检验该组数字的正确性。常见的校验码有中华人民共和国居民身份证的最后一位、ISBN号码的最后一位、组织机构代码的最后一位、数据传输的正确性验证码等。
书上介绍了三种校验码:奇偶校验码、海明校验码和循环冗余校验码。
奇偶校验码:通过在编码中增加一位校验位来使编码中1的个数为奇数或者为偶数,从而使码距变为2。对于奇校验,可以检测出代码中奇数位出错的代码,但是不能发现偶数位出错的情况。常用的有三种:水平奇偶校验码、垂直奇偶校验码和水平垂直校验码。
循环冗余校验码:利用生成多项式为k个数据位产生r个校验位来进行编码,其编码长度为k+r。在求CRC编码时,采用的是模2运算。(加减运算的规则是按位运算,不发生借位和进位。)
这里我们主要介绍一下海明校验码。之前视频中也讲过海明校验码,但是看完视频就蒙了,想着反正我们的学习是反复的,现在什么都不懂没事,先知道有这么个高大上的东西,之后还是会遇到的。然后再看书专项复习阶段,又遇到了,研究一下,通过视频中的例子来给大家分享。
视频中的例子:求信息1011的海明码。
首先,我们要知道海明校验码的实现原理:在K个数据位之外加上r个校验位,从而形成一个K+r位的新的码字,使新的码字的码距比较均匀的拉大。
根据公式2^r≥k+r+1,其中k为信息位,r为校验位数。因为1011共四位,所以k=4,求得r最小应该是3.
由于信息位和校验位一共是7位,所以海明码的位数是7位,由此确定初步的表格:
位数 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
信息位 |
|
|
|
|
|
|
|
校验位 |
|
|
|
|
|
|
|
因为校验位位置分配的规律是一般都放置在2^n上,也就是1、2、4、8……位置。得到如下的表格:
位数 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
信息位 |
|
|
|
|
|
|
|
校验位 |
R1 |
R2 |
|
R3 |
|
|
|
信息位的位置分配是从高位到低位依次存放。得到如下的表格:
位数 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
信息位 |
|
|
1 |
|
1 |
0 |
1 |
校验位 |
R1 |
R2 |
|
R3 |
|
|
|
注意:信息位从高位到低位依次排列,如果该位置被校验位占据之后就往后移,直到没有被占据的空位。
想要确定校验位的值,那我们就应该知道上面的信息位都是由哪几个校验位来进行校验的。
校验原则:被校验的海明位的下标等于所有参与校验该为的校验位的下标之和。即想要校验的信息位的位置(i)等于校验位的位置值相加。例如:我们要校验第三位,3=2+1,也就是用R1和R2来校验第3位。
由此原则得到每一个位置相对应的校验位表:
海明码 |
海明码的下标 |
校验位组 |
1 |
1 |
R1 |
2 |
2 |
R2 |
3 |
3=2+1 |
R1,R2 |
4 |
4 |
R3 |
5 |
5=4+1 |
R3,R1 |
6 |
6=4+2 |
R3,R2 |
7 |
7=4+2+1 |
R3,R2,R1 |
通过上面的表,我们知道了每一个校验码对应的校验的信息位:
校验码名称 |
校验的信息位 |
R1 |
1,3,5,7 |
R2 |
2,3,6 |
R3 |
4,5,6,7 |
通过以上的表,我们根据每个校验位校验的信息位的值进行异或运算,得出每个校验位的值。
异或运算:异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
即如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
例如:求R1的值
我们从以上的表中得知:R1是用来校验1、3、5、7位的。而1对应的信息位是空的,3、5、7对应的信息位都是1。
由此得出R1=1
同理求出R2=0,R3=0
位数 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
信息位 |
|
|
1 |
|
1 |
0 |
1 |
校验位 |
R1=1 |
R2=0 |
|
R3=0 |
|
|
|
将上面的数按照从低位到高位的排列顺序得到:1010101,就是我们要的海明码。
通过上面的表,我们知道一个信息位会被多个校验位进行校验,所以当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错了,为进一步自动纠错提供了依据。
有的时候我们就是应该将自己现在不懂的内容先放一下,因为我们会进行反复的学习,现在不懂只是因为我们还没到那个点上,要相信,终有一个点,我们会大彻大悟!
上面的内容虽然步骤可以整出来,但是有好多的名词有点疑惑,所以如果有问题,还请大家斧正!