海明码(汉明码)简单学习
当初学计算机网络的时候就仔细研究过汉海明码的原理,今天又看了一下感觉网络上说的都太复杂了,我想用很直观的方法来展示出来它的原理。
首先汉明码具有检错纠错功能,不过只能纠正一位错误。不多说了,上干货:
1.确定校验位的位数:要传送的信息位数为m,校验位为r。需要满足m+r+1<=2r ;
eg:要传送的是(100101)6位数据,得出5+r+1<=2r,r>=4,所以就至少需要4位校验位。
2.确定校验位的位置:令m+r=n,将n位数据按1,2,3…n-1,n.排好。那么校验位的位置在2^i处(i=0,1,2,…)即在第1,2,4,8,16…处,剩下的位置就是
数据位的位置啦。不明白?那就上例子呗~
eg:还是传送数据(100101)6位数据,加上4位校验位(P1,P2,P3,P4)总共10位数据(P1,P2,B3,P4,B5,B6,B7,P8,B9,B10).那么P1,P2,P3的位置在
第1、2、4、8位.所以实际传送的数据是这样的P1 P2 1 P3 0 0 1 P4 0 1.
3.确定校验位的值:确定校验位的值要首先确定采用奇校验还是偶校验。以偶校验为例
P1=B3⊕B5⊕B7⊕B9…
P2=B3⊕B6⊕B7⊕B10⊕B11…
P4=B5⊕B6⊕B7⊕B11⊕B12⊕B13⊕B14…
P8=B9⊕B10⊕B11⊕B12⊕B13⊕B14⊕B15…
这里就要注意了,你可能会问为什么要这样,校验位为什么是几个数据抑或(⊕)的和?为什么P1是这几个数的和,而P2又是另外几个数的和,他们是怎么组合的呢?(很棒,你是个会思考的孩子)。
对于第一个问题:
我们说了我们采用的校验方法是偶校验,拿P1来说,它要使得P1,B3,B5,B7…这个数列中1的个数为偶数个。那么可以用上面的公式来求得P1的值为0。原因是比如上例数据100101,其中B3、B5、B7、B9为1、0、1、0,则1的个数为2个为偶数个,那么P1只要为0就可以满足P1,B3,B5,B7…中1的个数为偶数个了。其他的P2、P3、P4同理。
对于第二个问题:
这是个很妙的事情,对于Pi,从Pi开始连续i位然后隔i位再连续i位直至最后相抑或(⊕)得到Pi。比如P4=B5⊕B6⊕B7⊕B12⊕B13⊕B14⊕B15…。等号后边是从P4开始(包括P4)连续4位再跳过4位(B8,B9,B10,B11)再连续4位B12,B13,B14,B15…这些位相抑或(⊕)得到P4。其他的校验码同理。
好了,解决上面的问题你应该知道该怎么求海明码了吧?!咱们在上一个例子来看一下:
我们要传送的数据是100101.那么要传送的数据是:P1 P2 1 P4 0 0 1 P8 0 1.
P1=B3⊕B5⊕B7⊕B9=1⊕0⊕1⊕0=0
P2=B3⊕B6⊕B7⊕B10=1⊕0⊕1⊕1=1
P4=B5⊕B6⊕B7=0⊕0⊕1=1
P8=B9⊕B10=0⊕1=1
所以实际传送的数据是0111001101.
好了,说了这么多你明白了吗?唉、、、我写的时候差点搞错。额、、、才艺不精!
4.数据的检验和纠错:我们在接收端接收到数据之后又是怎么样实现检错纠错的呢?等我考完试再写吧、、、