校验码 奇偶校验 海明码校验

1.奇偶校验

        奇偶校验(Parity Check)是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中"1"的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中"1"的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验"1"的个数是否为奇数,从而确定传输代码的正确性。

工作方式

为了能检测和纠正内存软错误,首先出现的是内存"奇偶校验"。内存中最小的单位是比特,也称为"位",位只有两种状态分别以1和0来标示,每8个连续的比特叫做一个字节(byte)。不带奇偶校验的内存每个字节只有8位,如果其某一位存储了错误的值,就会导致其存储的相应数据发生变化,进而导致应用程序发生错误。而奇偶校验就是在每一字节(8位)之外又增加了一位作为错误检测位。在某字节中存储数据之后,在其8个位上存储的数据是固定的,因为位只能有两种状态1或0,假设存储的数据用位标示为1、1、1、0、0、1、0、1,那么把每个位相加(1+1+1+0+0+1+0+1=5),结果是奇数。对于偶校验,校验位就定义为1;对于奇校验,则相反。当CPU读取存储的数据时,它会再次把前8位中存储的数据相加,计算结果是否与校验位相一致。从而一定程度上能检测出内存错误,奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误。

优缺点

奇偶校验有两种类型:奇校验和偶校验。奇偶校验位是一个表示给定位数的二进制数中1的个数是奇数或者偶数的二进制数,奇偶校验位是最简单的错误检测码。如果传输过程中包括校验位在内的奇数个数据位发生改变,那么奇偶校验位将出错表示传输过程有错误发生。因此,奇偶校验位是一种错误检测码,但是由于没有办法确定哪一位出错,所以它不能进行错误校正。发生错误时必须扔掉全部的数据,然后从头开始传输数据。在噪声很多的媒介上成功传输数据可能要花费很长的时间,甚至根本无法实现。但是奇偶校验位也有它的优点,它是使用一位数据能够达到的最好的校验码,并且它仅仅需要一些异或门就能够生成。奇偶校验被广泛应用。

2.海明码

海明码简介

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

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

海明码的校验位数
  下面本例以1010110为例进行海明码编码。
  第一步先确定需要多少位校验码。
  设数据有n位,校验码有x位。则校验码一共有2x2x种取值方式。其中需要一种取值方式表示数据正确,剩下2x−12x−1种取值方式表示有一位数据出错。因为编码后的二进制串有n+x位,因此x应该满足:2x−1≥n+x2x−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这种形式;
……..
每一行都是从对应的校验位开始校验,即从第2n/22n/2位开始校验,校验2n/22n/2个,然后跳过2n/22n/2个。
下面计算本例子,将表格中的位置用二进制表示:

 x1的计算:
x1是第一个校验码,位置对应栏所有最后一位为1(xxx1格式)的相异或为0,即
这里写图片描述

 

x1⊕1⊕0⊕0⊕1⊕0=0

则x1=0;
x2计算:
x2是第二个校验码,位置对应栏所有倒数第二位为1(xx1x格式)的相异或为0,即
这里写图片描述

 

x2⊕1⊕1⊕0⊕1⊕0=0

 

则x2=1;
x3计算:
x3是第三个校验码,位置对应栏所有倒数第三位为1(x1xx格式)的相异或为0,即
这里写图片描述

x3⊕0⊕1⊕0=0

 

则x3=1;
x4计算:
x4是第四个校验码,位置对应栏所有倒数第四位为1(1xxx格式)的相异或为0,即
这里写图片描述

x4⊕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,即第一位;但实际上是倒数第二位和最后一位都有错误,说明海明码不能校验两位以上出错的数据,即海明码只能检测并纠正一位错误。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值