汉明码实现原理
汉明码(Hamming Code)是广泛用于内存纠错的编码。汉明码不仅可检错,还可纠错。(只能发现和纠正一位错误,对于两位或者两位以上的错误无法纠正)。
我们约定一串编码里1的个数是偶数个,那么这串编码里携带的信息就是对的,否则就是错的。我们可以在开头对这串编码加一位校验码实现奇偶校验。比如:
我们想传输10010这串码,那么在传输的时候,就传010010,其中在开头的0就是校验位。
我们想传输10000这串码,那么在传输的时候,就传110000,其中在开头的1就是校验位。
两个例子的1的个数都是偶数。
首先汉明码是采用奇偶校验的码。它采用了一种非常巧妙的方式,把这串数字分了组,通过分组校验来确定哪一位出现了错误。
比如上图,数据分成3组,P1组中有一个错了,P2组没错,P3组没错。
P2组里谁都没错,可以排除2,4,5,7这几个数据;
P3组里谁都没错,可以排除3,4,6,7这几个数据;
很容易知道,是1这个数据有了错误。
因此,我们按照位置来分组,同时可以知道具体哪个位置数据比特错误,按照位置,
凡是位置符合这种形式的,XXX1,归到P1;
凡是位置符合这种形式的,XX1X,归到P2;
凡是位置符合这种形式的,X1XX,归到P3;
凡是位置符合这种形式的,1XXX,归到P4;
位置在1,3,5,7,9,11的数据进到P1组。
位置在2,3,6,7,10,11的数据进到P2组。
位置在4,5,6,7的数据进到P3组。
位置在8,9,10,11的数据进到P4组。
那么确定了分组,校验码的值也就顺便确定下来了。这样整个串的码就确定下来了。
那么显然各个校验码也被分到各个组里面去了,而且,每个组只有一个校验码。(这个,太简单我就不解释了……)
设将要进行检测的二进制代码为n位,为使其具有纠错能力,需要再加上k位的检测位,组成n+k位的代码。那么,新增加的检测位数k应满足:
汉明码的编码规则如下:
1.1.1 校验码的位置
这是规定,记住它,在采用汉明码的一串数据中,2的i次方的位置上,我们放校验码。
校验码是1,或者是0,使得校验码所在的组的1的个数是偶数。
如图:
绿色的位置是放校验码的地方,1,2,4,8,16……等等,2的i次方的地方。
1.1.2 汉明码编码实例
以10101编码为例,创建一个汉明码编码的空间,并且把源码填入编码的对应位置中,_ _ 1_010_1,并留出校验码位(校验位先设为0)。(因为2^4 - 1>= 5+4 满足,而 2^3-1>= 5+3所以需要4位校验码)
-
计算校验码第1位,1,3,5,7,9异或为0,所以汉明码第2^(1-1)位为0,结果为:0_1_010_1
-
计算校验码第2位,2,3,6,7异或为0,所以汉明码第2^(2-1)位为0,结果为:001_010_1
-
计算校验码第3位,4,5,6,7异或为1,所以汉明码第2^(3-1)位为1,结果为:0011010_ 1
-
计算校验码第4位,8, 9异或为1,所以汉明码第2^(4-1)位为1,结果为:001101011
所以最终编码为001101011.
1.1.3 汉明码校验错误实例
假设收到编码为001101001,我们可以发现汉明码的第8位与原来的汉明码001101011不同,那我们怎么找出这个第8位的错误编码呢?
算法很简单,我们只要在算汉明码校验位的算法的上再算一遍,就得到了汉明码的校验方法,比如计算001101001对应的2^k位。
1,3,5,7,9进行异或,得到0
2,3,6,7进行异或,得到0
4,5,6,7进行异或,得到0
8,9进行异或,得到1
我们把上述结果反着排列,得到1000,即十进制的8,根据汉明码的校验规则,编码出错的地方即在第8位,我们把第8位的0换成1,即可得原来的编码001101011。
上述的例子是出现在2k的校验位上的,如果出现在非2k位上,得到的结果也是一样的,比如:假设收到的编码为001100011,即第6位出了错误,我们根据规则
1,3,5,7,9进行异或,得到0
2,3,6,7进行异或,得到1
4,5,6,7进行异或,得到1
8,9进行异或,得到0
我们把上述结果反着排列,得到0110,即十进制的6,根据汉明码的校验规则,编码出错的地方即在第6位,我们把第6位的0换成1,即可得原来的编码001101011。
参考链接:
汉明码(Hamming Code)原理及实现
https://blog.csdn.net/qq_38526635/article/details/82842383
说人话,汉明码(海明码、hamming code)通俗易懂的解释,说人话
https://blog.csdn.net/Yonggie/article/details/83186280
欢迎加入技术交流群,先加我微信,我拉你进群!
感谢阅读,别走!点赞、关注、转发后再走吧