海明码之编码原理和校验方法

海明码简介

  海明码,小名汉明码(Hamming Code),以发明者理查德·卫斯里·汉明的名字命名。海明码具有检错和纠错双功能,它基于奇偶校验原理,只能检查出某一位错码的位置。当有多位错码时,它就不适用了。

异或运算

  在了解汉明码之前,先熟悉下异或运算和奇偶校验。
异或运算,相为1,相同为0。它也叫模2和、模2加法,本质上是不带进位的加法。
数学符号是 ⊕;
计算机符号是“xor”;
C语言中异或符号是^;
常用的公式是:(a^b)^a=b,即两个数异或结果在与其中一个数异或得到的是另一个数。
常用的应用:多用在一些加密算法中,将要加密的数据和一些已知数进行异或运算,得到加密后的数据。
奇偶校验 :
这里写图片描述

海明码的校验位数

  下面本例以1010110为例进行海明码编码。
  第一步先确定需要多少位校验码。
  设数据有n位,校验码有x位。则校验码一共有 2 x 种取值方式。其中需要一种取值方式表示数据正确,剩下 2 x 1 种取值方式表示有一位数据出错。因为编码后的二进制串有n+x位,因此x应该满足: 2 x 1 n + x    
使不等式成立的x的最小值就是校验码的位数。在本例中,n=7,解得x=4。
信息码和校验码的对应关系如下表:
这里写图片描述

校验码的位置

  校验码在二进制串中的位置为2的整数幂,即1、2、4、8、16……..剩下的位置是信息码,如图(来源百度),绿色为校验位:
这里写图片描述  
本例的校验码位置如下图:
这里写图片描述

计算校验位的值

由于奇偶校验原理一样,偶校验的计算更为简单,实际中多用偶校验,本例中也以偶校验进行计算。
这里写图片描述
如图中:
第一行中每个X跳过1位;第一行所有的X值进行异或是0;第一行的X对应的数据位位置转化为二进制最后一位都是1,即是xxx1这种形式
第二行中每2个X跳过2位;第二行所有的X值进行异或是0;第二行的X对应的数据位位置转化为二进制倒数第二位一位都是,即是xx1x这种形式
第三行中每4个X跳过4位;第三行所有的X值进行异或是0;第三行的X对应的数据位位置转化为二进制倒数第三位一位都是1,即是x1xx这种形式
第四行中每8个X跳过8位;第四行所有的X值进行异或是0;第四行的X对应的数据位位置转化为二进制倒数第四位一位都是1,即是1xxx这种形式
……..
每一行都是从对应的校验位开始校验,即从第 2 n / 2 位开始校验,校验 2 n / 2 个,然后跳过 2 n / 2 个。
下面计算本例子,将表格中的位置用二进制表示:
这里写图片描述
x1的计算:
x1是第一个校验码,位置对应栏所有最后一位为1(xxx1格式)的相异或为0,即
这里写图片描述

x 1 1 0 0 1 0 = 0
则x1=0;
x2计算:
x2是第二个校验码,位置对应栏所有倒数第二位为1(xx1x格式)的相异或为0,即
这里写图片描述
x 2 1 1 0 1 0 = 0
则x2=1;
x3计算:
x3是第三个校验码,位置对应栏所有倒数第三位为1(x1xx格式)的相异或为0,即
这里写图片描述
x 3 0 1 0 = 0
则x3=1;
x4计算:
x4是第四个校验码,位置对应栏所有倒数第四位为1(1xxx格式)的相异或为0,即
这里写图片描述
x 4 1 1 0 = 0
则x4=0;
所以最终的海明码是01110100110。
这里写图片描述

海明码的校验

假设位置为1011的数据传输错误,由0变成了1,则校验纠错的过程为:
  将所有位置形如xxx1, xx1x, x1xx, 1xxx的数据分别异或。
  xxx1: 0^1^0^0^1^1 = 1
  xx1x: 1^1^1^0^1^1 = 1
  x1x: 1^0^1^0 = 0
  1xxx: 0^1^1^1 = 1
 那么出错数据的位置为1011,这样便可得到出错的位置。

假设同时有两个位置出错,本例中假设位置为1010对应数据由1变成0,,位置为1011对应数据由0变成1,则推出校验纠错过程:
  xxx1: 0^1^0^0^1^1 = 1
  xx1x: 1^1^1^0^0^1 = 0
  x1x: 1^0^1^0 = 0
  1xxx: 0^1^0^1 = 0
那么校算出的错误位是0001,即第一位;但实际上是倒数第二位和最后一位都有错误,说明海明码不能校验两位以上出错的数据,即海明码只能检测并纠正一位错误
 
 

猜你喜欢

转载自blog.csdn.net/u014470361/article/details/79848824