汉明码(检两位错,纠一位错)
~~~借鉴自大佬的博客,写的很好~~~
-----------------------------------------------采用偶校验和奇校验原理部分相同,本篇采用偶校验
校验码个数k:
(n为数据位数)
附表 k的取值:
n | 1 | 2-4 | 5-11 | 12-26 | 27-57 | 58-120 | ······ |
k | 2 | 3 | 4 | 5 | 6 | 7 | ······ |
校验码分别设为 ······
校验码位置: 位置上(1、2、4、8、16 ······)
确定校验码的值(保证组内数据1的个数为偶数从而确定校验码的值):
由二进制位置为xxx1的数据组确定(位置为1,3,5,7,9,11 ·······的数据组)
由二进制位置为xx1x的数据组确定(位置为2,3,6,7,10,11 ·······的数据组)
由二进制位置为x1xx的数据组确定(位置为4,5,6,7 ·······的数据组)
由二进制位置为1xxx的数据组确定(位置为8,9,10,11 ·······的数据组)
······
检错:
将接收到的序列的位置上的
及其对应的数据组 异或 得到的i+1个值 逆序排列 转化为十进制 即为出错的位置
例:
数据 1010
校验码个数 k=3
设汉明码为 H1,H2,H3,H4,H5,H6,H7
数据为D1,D2,D3,D4
校验码为P1,P2,P3
则 H1=P1 H2=P2 H4=P3 剩下的依次放入数据
H1 | H2 | H3 | H4 | H5 | H6 | H7 |
P1 | P2 | D1 | P3 | D2 | D3 | D4 |
1 | 0 | 1 | 0 |
P1 由3,5,7位置上的数据决定(分别为1,0,0),所以P1 = 1
P2 由3,6,7位置上的数据决定(分别为1,1,0),所以P2 = 0
P3 由5,6,7位置上的数据决定(分别为0,1,0),所以P3 = 1
H1 | H2 | H3 | H4 | H5 | H6 | H7 |
P1 | P2 | D1 | P3 | D2 | D3 | D4 |
1 | 0 | 1 | 1 | 0 | 1 | 0 |
所以汉明码为 1011010
假设收到的序列为 1011110
H1 | H2 | H3 | H4 | H5 | H6 | H7 |
1 | 0 | 1 | 1 | 1 | 1 | 0 |
H1⊕H3⊕H5⊕H7= 1
H2⊕H3⊕H6⊕H7= 0
H4⊕H5⊕H6⊕H7= 1
逆序排列为 101
即第5位出了差错,取反即为原序列,
再去掉位置上的数就是要传送的数据