以数据码1010为例,海明码的编码原理如下
(1)确定海明码的位数
设n是有效信息的位数(数据码1010,所以n=4),k是校验码的位数,n和k应满足
这里k取3。
将信息位分为4位:
校验位3位:
对应的海明码是7位:
(2)确定校验码的分布
需要将数据码和校验码按一定规律,插入到对应的海明码位置上。
直接给出规定: 放在海明码号为
的位置上。
那么 就放在
上,
放在
上,
放在
上,再将数据码按原来顺序插入,可以得到:
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
(3)分组形成校验关系
这一步需要确定的是,每个信息位由哪几个校验位进行管理
![]() | ![]() | ![]() | |
![]() ![]() ![]() ![]() | 1 | 2 | |
![]() ![]() ![]() ![]() | 1 | 4 | |
![]() ![]() ![]() ![]() | 2 | 4 | |
![]() ![]() ![]() ![]() ![]() | 1 | 2 | 4 |
将下标转换为二进制更容易理解,
的对应的海明码号(H)的下标二进制表示为
![]() ![]() | 1 |
![]() ![]() | 10 |
![]() ![]() | 100 |
假如有第四位校验位,那么他对应的海明码微应该是8,二进制为 1000,依次类推。
二进制分组的表示为
![]() | ![]() | ![]() | |
![]() ![]() ![]() ![]() | 1 | 10 | |
![]() ![]() ![]() ![]() | 1 | 100 | |
![]() ![]() ![]() ![]() | 10 | 100 | |
![]() ![]() ![]() ![]() ![]() | 1 | 10 | 100 |
信息位是可以由多个校验位的唯一组合确定。
(4)校验位取值
校验位 的取值,由和这个校验位有关的信息位全部求异或
那么1010对应的海明码为1010 010,加出的是校验码,其余的是信息位。
(5)海明码校验原理
分别用校验位和对应的所有信息位求异或,如果得到的值为0,说明没有出错,反之出错
可以看到,在每个式子中,与校验位异或的信息位,正是求得其本身的数据。
S的取值有以下三种情况:
1.假如数据传输没有出错,那么相当于S1就等于P1与P1进行异或,结果一定是0。
2.S1中出现了一位传输错误,那么P1或者后面数据一定会发生变化,一定不等于P1,得到的结果就是1。
3.S1中出现了多位传输错误,但是P1的值没有发生变化。因为一个数据变化会影响多个S的值,所以其他S一定会出现不等于0的情况,那么相当于回到了第二种情况
如何找到出错的是哪位:
将三个S组合,得到的值就是出错的位数,假设 ,那么出错的位数就是
(001)
直接将该位取反,就达到了纠错的目的。