计算机在进行通信的过程中,无论通信系统如何可靠,都不能保证信号传输没有差错。因此,在进行网络信息通信的过程中,需要有可靠的技术来检错和纠错。
今天,就让我们一起来学习其中一种可靠性比较高的校验技术——
海明码,是1950年,由海明(Hamming)研究出来的利用冗余数据位来检测和纠正代码差错的理论和方法。按照海明的理论,可以在数据代码上添加若干冗余位组成码字,码字之间的海明距离是一个码字要变成另一个码字时必须改变的最小位数。
如何理解这里的海明距离。例如,7位的ASCII码,将其增加为8位,第8位作为校验位的话,一般做奇偶校验。
奇校验:正确代码一个字节中1的个数必须是奇数,若非奇数,则在校验位添加1,使之变为奇数。
偶校验:正确代码一个字节中1的个数必须是偶数,如非偶数,则在校验位添加1,使之变为偶数。
这样,最近的两个7位码之间相差1位,而校验码同样因为这一位不同,而发生改变,这样,相邻的两个8位码之间至少有两个位数不同,那么他们的海明距离就是2。
下图,是曹老师利用Excel将128位ASCII码转化后使用奇偶校验转为8位ASCII的示意图。
转为10进制可以看到,两个相邻数值之间最大值为3,小于4,而4是2的2次方,即2位,所以海明距离为2.
使用奇偶校验只能检测出一位出错,如果传输过程中有2位数据出错,那么数据就变为了另外一个码字,这样计算机就会认为传输的是另一个码字。
因此,海明提出的理论,比奇偶校验复杂很多。
作为初学者,如果直接看教科书,真的晦涩难懂。今天,曹老师就和大家一起用通俗的话来理解海明码。
第一步:明白数据位和冗余位。
假设,我们要传输数据10101111,这个数据一共有8位,所以传输的数据位为:8。
按照计算机的权位,可以知道2的3次方等于8,所以,最高位的权位3+1=4,因此,对于8位的数据位需要的冗余位为4位。如果数据位为9(2的3方不够,需要2的4方才能容纳下9,因此是最高权位为4+1),那么冗余位为5。
海明码规定从左到右依次为最高位到最低位(当然你也可以从右到左,对应的冗余位的值就不一样)。校验码的位置2的n次方,n=0,1,2,3,..... 即第1位,第2位,第4位,第8位。
第二步:明白每一位冗余位关联的数据位
R表示冗余位
S表述数据位
下面教大家两种位数关联的方法:
方法1:通配法
按照上述例子冗余位共有4位,所以可以对每一位冗余位使用*进行通配,每一位*可以替换为0/1,从而得到数值,该数值就是关联的位数,但不能超过总数(冗余位+数据位),这里为12。
第1位:***1,关联位数为1、3、5、7、9、11。即0001(1),0011(3)、0101(5)、0111(7)、1001(9)、1011(11)。1101(13)及以后已超过12,因此不再划入。
第2位:**1*,关联位数为2、3、6、7、10、11。即0010(2)、0011(3)、0110(6)、0111(7)、1010(10)、1011(11)。1110(14)及以后已超过12,因此不再划入。
第3位:*1**关联位数为4、5、6、7、12。即0100(4)、0101(5)、0110(6)、0111(7)、1100(12)。1101(13)及以后已超过12,因此不再划入。
第4位:1***关联位数为8、9、10、11、12。即1000(8)、1001(9)、1010(10)、1011(11)、1100(12)。1101(13)及以后已超过12,因此不再划入。
统计下来就是下面蓝色部分的单元格。
接下来,只需要把上图中蓝色位置换为对应的数据即可,如果没有数据,我们用X表示,即最后需要求出的冗余位。
⊕代表计算机中的异或(a和b相同,结果为0,不同为1,也就是奇数个1为1,偶数个1为0,又叫做不进位加法)。
第1位:X⊕1⊕0⊕0⊕1⊕1=0。海明码默认为偶校验,显然上述等式结果为0,而前面却只有3个1,为奇数个1,所以X=1,这样才能凑够偶数个1。
第2位:X⊕1⊕1⊕0⊕1⊕1=0。已经有了4个1了,刚好偶数个,不缺1了,所以X=0。
第3位:X⊕0⊕1⊕0⊕1=0。已经有了2个1了,偶数个1,所以X=0。
第4位:X⊕1⊕1⊕1⊕1=0。4个1,偶数,所以X=0。
所以四位冗余位分别为1000。将冗余位和数据位按顺序填充,结果为101001001111。
方法2:海明距离法
在上图中,大家有没有发现规律?
1. 每一位起始位都是我们需要求解的冗余位,即从冗余位开始数1,2,4,8,...。
2. 每次数的位数是间隔2的n次方的距离。
第1位间隔1位,为1、3、5、7、9;
第2位间隔距离为2的1次方,即2位,2和3、6和7、10和11,其中5和6、8和9刚好被舍弃掉;
第3位间隔距离为2的2次方,即4位,从第3个冗余位(第4位)开始,4、5、6、7(保留)、8、9、10、11(舍弃)、12、13、14、15(保留,但最高位为12,所以舍弃12后面的3位);
第4位为2的3次方,即8位,每次要数8位,从第4个冗余位开始数(第8位),8、9、10、11、12、13、14、15(保留,其中12以后的位数舍弃)。
是不是发现:
第1种方法是数字运算,
第2种方法是分组划区域计算,
显然,第2种方法更快。
海明码注意事项:
1. 海明码可以纠正数据中1位数据错误的情况,但如果错误的数据有2位就只能检测出来,而不能修正。此时,你需要更强大的校验码,如循环冗余校验码。
2. 通常默认为偶校验。
3. 数据只有0和1,计算机里面存储数据为0和1(除了第1台计算机)。
4. 通常按照从左到右依次为高位到低位(也可以从右到左)。
5. 其难点在 分组,利用海明距离分组比利用通配法分组要更容易。