海明码进行纠错
海明纠错码

5.3.6 海明纠错码海明码(Hamming Code)是一个可以有多个校验位,具有检测并纠正一位错误代码的纠错码,所以它也仅用于信道特性比较好的环境中,如以太局域网中,因为如果信道特性不好的情况下,出现的错误通常不是一位。
海明码的检错、纠错基本思想是将有效信息按某种规律分成若干组,每组安排一个校验位进行奇偶性测试,然后产生多位检测信息,并从中得出具体的出错位置,最后通过对错误位取反(也是原来是1就变成0,原来是0就变成1)来将其纠正。
要采用海明码纠错,需要按以下步骤来进行:计算校验位数→确定校验码位置→确定校验码→实现校验和纠错。
下面来具体介绍这几个步骤。
本文先介绍除最后一个步骤的其它几个步骤。
1. 计算校验位数要使用海明码纠错,首先就要确定发送的数据所需要要的校验码(也就是“海明码”)位数(也称“校验码长度”)。
它是这样的规定的:假设用N表示添加了校验码位后整个信息的二进制位数,用K代表其中有效信息位数,r表示添加的校验码位,它们之间的关系应满足:N=K +r≤2r-1。
如K=5,则要求2r-r≥5+1=6,根据计算可以得知r的最小值为4,也就是要校验5位信息码,则要插入4位校验码。
如果信息码是8位,则要求2r-r≥8+1=9,根据计算可以得知r的最小值也为4。
根据经验总结,得出信息码和校验码位数之间的关系如表5-1所示。
表5-1 信息码位数与校验码位数之间的关系现假设原来的8位信息码为10011101,因现在还没有求出各位校验码值,现在这些校验码位都用“?”表示,最终的码字为:??1?001?1101。
3. 确定校验码经过前面的两步,我们已经确定了所需的校验码位数和这些校验码的插入位置,但这还不够,还得确定各个校验码值。
这些校验码的值不是随意的,每个校验位的值代表了代码字中部分数据位的奇偶性(最终要根据是采用奇校验,还是偶校验来确定),其所在位置决定了要校验的比特位序列。
总的原则是:第i位校验码从当前位开始,每次连续校验i(这里是数值i,不是第i位,下同)位后再跳过i位,然后再连续校验i位,再跳过i位,以此类推。
海明校验码

• 依次类推,便可确定每组所包含的各位。
例如:欲传递信息为b4b3b2b1(n=4),根据 2k≥n+k+1,可求出配置成海明码需增添检测位 k=3,且它们位置的安排如下:
二进制序号 1 2 3 4 5 6 7
名称
C1 C2 b4 C4 b3 b2 b1
如果按照配偶原则来配置海明码,则
C1 应使1,3,5,7位中的“1”的个数为偶数;
• 故0101的海明码应为:C1 C2 b4 C4 b3 b2 b1,即0100101。
三、海明码的纠错过程
• 海明码的纠错过程,实际上是对传送后的海明 码形成新的检测位Pi(i=1,2,4,8……),根据Pi 的状态,便可直接指出错误的位置。Pi的状态是 由原检测位Ci及其所在小组内“1”的个数确定的。 倘若按配偶原则配置的海明码,其传送后形成 新的检测位Pi应为0,否则说明传送有错,并且 还可以直接指出出错的位置。由于Pi和Ci有其对 应关系,故Pi可由下式确定:
• 设n+k位代码自左至右依次编为第1,2, 3,…...,n+k位,而将k位检测位记为Ci(i=1, 2,4,8……),分别安插在n+k位代码编号的 第1,2,4,8,……2k-1位上。这些检测位的位 置设置,是为了保证它们能分别承担n+k位信息 中,不同数位所组成的“小组”的奇偶检查任 务,使检测位和它所负责检测的小组中1的个数 为奇数或为偶数,具体分配如下:
C2 应使2,3,6,7位中的“1”的个数为偶数;
C4 应使4,5,6,7位中的“1”的个数为偶数;
故 C1应为3位⊕5位⊕7位,即C1=b4⊕b3⊕b1;
C2应为3位⊕6位⊕7位,即C2=b4⊕b2⊕b1;
C4应为5位⊕6位⊕7位,即C4=b3⊕b2⊕b1;
海明码纠错原理

海明码纠错原理海明码(Hamming Code)是一种用于检错和纠错的编码方式,由理查德·海明在1950年提出。
它可以发现并纠正单一位错误,也可以检测并纠正双位错误。
海明码的纠错原理是通过增加校验位来实现的,下面我们来详细了解一下海明码的纠错原理。
首先,海明码是一种线性分组码,它的编码方式是将数据位和校验位按照一定规则排列组合而成。
在传输数据时,发送端会对数据进行编码,添加校验位后发送出去;接收端收到数据后,会对接收到的数据进行解码,并根据校验位进行错误的检测和纠正。
其次,海明码的纠错原理是基于奇偶校验的。
在海明码中,校验位的位置是通过2的幂次方来确定的,例如第1、2、4、8、16位是校验位,其余位是数据位。
对于校验位而言,每一个校验位都负责一定范围内的数据位的奇偶校验。
当接收端接收到数据后,会对每个校验位进行奇偶校验,如果发现某个校验位的奇偶校验与接收到的数据不一致,就会根据校验位的位置确定出错的位置,并进行纠正。
最后,海明码的纠错原理可以通过一个简单的例子来说明。
假设发送端要发送一个4位的数据1010,按照海明码的规则,需要添加3个校验位。
经过编码后,发送的数据变为1010101。
在传输过程中,如果某一位发生了错误,例如1010101中的第4位发生了错误,接收端在接收到数据后,会对每个校验位进行奇偶校验,发现第2位和第4位的奇偶校验不一致,根据校验位的位置,可以确定出错的位置是第4位,然后进行纠正,将错误的位从0变为1。
最终,接收端得到的数据是1010,错误被成功纠正。
综上所述,海明码的纠错原理是通过增加校验位来实现的,通过对校验位的奇偶校验来检测错误,并根据校验位的位置进行错误的定位和纠正。
海明码在通信领域有着广泛的应用,能够有效地提高数据传输的可靠性和稳定性,是一种非常实用的纠错编码方式。
海明码的C++实现(编码+纠错)

/*海明码的C++实现此程序的运行机制:输入的数据必须位1,0 字符串,输入的二进制位必须在1-12范围内如果输入的数据在1-8位范围,将调用海明码编码函数,对输入数据进行海明码编码,编码成12位二进制,1 ,2 ,4,8为校验位,3 ,5,6,7,9,10,11,12为数据位。
注(输入数据不满8位,默认为高位为0,例:输入数据为110,默认为00000110)输入数据位数大于等于9小于等于12位时,调用海明码校验函数,如果待校验的海明码有一位出错,提示出错位置,并校正,输出正确的海明码编码。
如果出错位数大于1,将无法正常纠错,容错处理只能提示部分错误位数超过1的编码,望大虾们能够完善此处的不足。
注(输入数据不足12位的,高位默认为0,例:1010101010 默认为001010101010)。
本人菜鸟,望各位大虾批评指出,不喜勿喷~~!*/#include "stdafx.h"#include <iostream>#include <bitset>#include <string>#include <algorithm>using namespace std;void Hamming(string str) // 输入数据在1-8位,求海明码{bitset<13> b;int j=0;int sum;reverse(str.begin(),str.end());for(int i=12;i>0;i--) //将二进制数放入海明码序列,校验位默认值为0{if(i==1||i==2||i==4||i==8)continue;else{if(str[j]=='1'){b.set(i);j++;}elsej++;}}//校验位的判断//第一校验位的判断sum=0;sum=b.test(3)+b.test(5)+b.test(7)+b.test(9)+b.test(11);if(1==sum%2)b.set(1);//第二校验位的判断sum=0;sum=b.test(3)+b.test(6)+b.test(7)+b.test(10)+b.test(11);if(1==sum%2)b.set(2);//第四校验位的判断sum=0;sum=b.test(5)+b.test(6)+b.test(7)+b.test(12);if(1==sum%2)b.set(4);//第八校验位的判断sum=0;sum=b.test(9)+b.test(10)+b.test(11)+b.test(12);if(1==sum%2)b.set(8);cout<<"海明码编码为:"<<endl;for(int k=1;k<=12;k++)cout<<b[k];cout<<endl;}void ReHamming(string str) //海明码的校验,输入数据位9-12位{bitset<13> b;bitset<5> keyb;bool a1=0,a2=0,a4=0,a8=0;int sum=0;int j=0;reverse(str.begin(),str.end());for(int i=12;i>=1;i--){if(str[j]=='1'){b.set(i);j++;}elsej++;}//第一校验位的a1if((b.test(3)+b.test(5)+b.test(7)+b.test(9)+b.test(11))%2==1) a1=1;//第二校验位的a2if((b.test(3)+b.test(6)+b.test(7)+b.test(10)+b.test(11))%2==1) a2=1;//第三校验位的a4if((b.test(5)+b.test(6)+b.test(7)+b.test(12))%2==1)a4=1;//第四校验位的a8if((b.test(9)+b.test(10)+b.test(11)+b.test(12))%2==1)a8=1;if(b.test(1))keyb.set(1);if(b.test(2)==1)keyb.set(2);if(b.test(4)==1)keyb.set(3);if(b.test(8)==1)keyb.set(4);//判断if(a1!=keyb.test(1)){sum+=1;}if(a2!=keyb.test(2)){sum+=2;}if(a4!=keyb.test(3)){sum+=4;}if(a8!=keyb.test(4)){sum+=8;}//处理if(sum==0)cout<<"海明码编码正确!!"<<endl;else if(sum>1&&sum<=12){cout<<"海明码第"<<sum<<"位出错"<<endl;cout<<"正确编码为:"<<endl;if(b.test(sum)==1)b.reset(sum);elseb.set(sum);for(int v=1;v<13;v++)cout<<b[v];cout<<endl;}elsecout<<"错位位数超过1位,无法纠错!"<<endl;cout<<endl;}int main(int argc, char* argv[]){string str;int select;cin>>str;for(int i=0;i<str.size();i++){if(str[i]!='1'&&str[i]!='0'){cout<<"输入不合法,只能包含0,1字符串"<<endl;return 0;}}if(str.size()<=8&&str.size()>=1)select=1;else if(str.size()<=12&&str.size()>8)select=2;elseselect=3;switch(select){case 1:Hamming(str);break;case 2:ReHamming(str);break;case 3:cout<<"输入数据长度不合法,长度应在1~12区间内"<<endl;break;}return 0;}运行样例:1.编码2纠错2.1编码正确2.2编码错误。
3-3_纠1位错的海明码

第三章数据链路层纠1位错的海明码要传输的数据是m位,冗余位r应该是多少,才能纠正1位错来呢?设一个系统中,编码后的码字位数是n ,则n=m+r 。
因为要传输的数据位是m 位,该系统需要传输的正确的码字个数应该是2m ,全部码字的个数是2n 。
如果每个正确码字发生1位错,能够被纠错,至少发生1位错不会变成另外1个正确的码字,如果n 位码字的每一位都发生一次跳变,变成一个错误的码字,那么每个码字至少需要n+1个码字来表示它,所以,下面这个式子成立:(1)22 (1)2m nrn n m r m r +≤=+⇓++≤纠正单个错需要的冗余位跟数据位的关系 纠正单个错误需要的校验位的下界满足:m r n(码字的总位数)1 2 32~4 3 5~75~11 49~1512~26 5 17~3127~57 6 33~6358~120 7 65~127++≤m r(1)2r海明纠错码(1950年)☐每一个码字从左到右编号,最左边为第1位☐校验位和数据位凡编号为2的乘幂的位是校验位,如1、2、4、8、16、……其余是数据位,如3、5、6、7、9、……☐每一个校验位设置根据:包括自己在内的一些位的集合的奇偶值(奇数或偶数)。
如何决定每个数据位的校验位☐将某一位数据位的编号展开成2的乘幂的和,那末每一项所对应的位即为该数据位的校验位(收方使用)。
如:11 = 1 + 2 + 829 = 1 + 4 + 8 + 16校验位1的检验集合为所有奇数位。
校验位2的检验集合:2、3、6、7、10、11、…校验位4的检验集合:4、5、6、7、……校验位8的检验集合:8、9、10、11、……校验位的计算(m=7,r=4)B1B2B3B4B5B6B7B8B9B10B11P1P2D1P3D2D3D4P4D5D6D7 1=20√√√√√√2=21√√√√√√4=22√√√√8=23√√√√海明码实例如何确定校验位?7位数据位海明码实例之校验位计算B1B2B3B4B5B6B7B8B9B10B11P1P2D1P3D2D3D4P4D5D6D7信息码--1-001-000检验位00-1---0---海明码00110010000使用偶校验,一个校验集合里的1的个数是偶数海明码纠错过程( 接收端)☐首先将差错计数器置“0”,counter=0。
4位数据海明校验码的生成与纠错

数据在传输或存储过程中常常会出现错误,为了保证数据的完整性和准确性,通常会采用校验码来进行数据校验和纠错。
海明码是一种常用的校验码之一,它能够在一定程度上实现数据的纠错和校验。
本文将详细介绍4位数据海明校验码的生成与纠错原理及方法。
一、海明码的基本原理海明码是由美国数学家理查德·海明提出的一种能够检测和纠正数据中出现的错误的编码方式。
它通过向数据中添加校验位来实现对数据进行校验和纠错。
海明码的基本原理可以概括为以下几点:1. 通过向数据中添加冗余位来实现纠错功能。
2. 通过对数据进行位的异或运算来计算校验位。
3. 通过校验位的比较来检测错误位并进行纠错。
二、4位数据海明校验码的生成方法在生成4位数据海明校验码时,需要依据原始数据的位数来确定校验位的数量。
对于4位数据,通常采用2位校验位。
而具体的生成方法如下:1. 将4位原始数据表示成二维矩阵形式。
2. 根据原始数据矩阵的每一列,计算出校验位的值。
3. 将校验位添加到原始数据矩阵中。
4. 根据生成的数据矩阵,计算出校验位的值并添加到数据中。
三、4位数据海明校验码的纠错方法当使用4位数据海明校验码进行数据传输或存储时,若出现错误,需要通过校验位来检测错误位并进行纠错。
纠错方法如下:1. 对接收到的数据进行校验,计算出校验位的值。
2. 将计算得到的校验位的值与接收到的校验位的值进行比较。
3. 根据比较结果确定错误位的位置,并将其进行纠正。
四、4位数据海明校验码的应用场景4位数据海明校验码主要应用于对数据进行短距离传输和存储过程中。
其应用场景包括但不限于以下几种情况:1. 在计算机内存中对数据进行校验和纠错。
2. 在通信传输过程中对数据进行校验和纠错。
3. 在存储介质中对数据进行校验和纠错。
4. 在传感器数据采集过程中对数据进行校验和纠错。
五、4位数据海明校验码的优缺点4位数据海明校验码作为一种常见的纠错码,具有一定的优点和缺点。
主要表现在以下几个方面:优点:1. 能够有效检测和纠正数据中出现的错误。
海明码编码计算、检错和纠错原理解析

一、海明码检错/纠错基本思想海明码(Hamming Code)是一个可以有多个校验位,具有检测并纠正一位错误代码的纠错码,所以也仅用于信道特性比较好的环境中,如以太局域网。
它的检错、纠错基本思想如下:(1)将有效信息按某种规律分成若干组,每组安排一个校验位通过异或运算进行校验,得出具体的校验码(2)在接收端同样通过异或运算看各组校验结果是否正确,并观察出错的校校组,或者多个出错的校验组的共同校验位,得出具体的出错比特位(3)对错误位取反来将其纠正二、海明码计算海明码计算要按以下步骤来进行:计算校验码位数→确定校验码位置→确定校验码1. 计算校验码位数假设用N表示添加了校验码位后整个传输信息的二进制位数,用K代表其中有效信息位数,r表示添加的校验码位数,它们之间的关系应满足:N=K+r≤2r-1(是为了确保r位校验码能校验全部的数据位,因为r位校验码所能表示的最大十进制数为2r-1,同时也确保各位码本身不被其他校验码校验)信息码位数12~45~1112~2627~5758~120121~247校验码位数2 3 4 5 6 7 82. 确定校验码位置海明码的校验码的位置必须是在2n次方位置(n从0 开始,分别代表从左边数起分别是第1、2、4、8、16……),信息码也就是在非2n次方位置3. 确定校验码校验位置选择原则:第i位校验码从当前校验码位开始,每次连续校验i位后再跳过i位,然后再连续校验i位,再跳过i位,以此类推。
确定每个校验码所校验的比特位:P1校验码位校验的码字位为:第1位(也就是P1本身)、第3位、第5位、第7位、第9位、第11位、第13位、第15位,……。
P2校验码位校验的码字位为:第2位(也就是P2本身)、第3位,第6位、第7位,第10位、第11位,第14位、第15位,……。
P3校验码位校验的码字位为:第4位(也就是P4本身)、第5位、第6位、第7位,第12位、第13位、第14位、第15位,第20位、第21位、第22位、第23位,……。
数据传输中常用的差错检验技术

数据传输中常用的差错检验技术常用的差错检验技术是在数据传输过程中用来检测和纠正错误的方法。
这些技术被广泛应用于计算机网络和通信系统中,以确保数据的可靠性和完整性。
一、奇偶校验奇偶校验是一种简单的差错检验技术。
它通过在数据中添加一个奇偶位来检测错误。
在传输数据之前,发送方将数据中的所有位进行计数,并决定奇偶位的值,使得数据中1的个数是奇数或偶数。
接收方在接收到数据后,再次计算数据中1的个数,并与奇偶位的值进行比较。
如果两者不一致,则说明数据中存在错误。
二、循环冗余检验(CRC)循环冗余检验是一种更强大的差错检验技术。
它通过在数据中添加一个循环冗余码来检测错误。
发送方在传输数据之前,计算数据的循环冗余码,并将其附加在数据后面一起传输。
接收方在接收到数据后,再次计算数据的循环冗余码,并与接收到的冗余码进行比较。
如果两者一致,则说明数据传输没有出错。
三、海明码海明码是一种更高级的差错检验技术。
它通过在数据中添加冗余位来检测和纠正错误。
发送方在传输数据之前,根据数据的长度选择适当的海明码,并将其添加到数据中。
接收方在接收到数据后,通过检查冗余位的值来检测错误,并使用海明码的纠错能力来纠正错误。
四、前向纠错码(FEC)前向纠错码是一种能够检测和纠正错误的差错检验技术。
与传统的纠错码不同,前向纠错码在发送方将数据进行编码时就添加了冗余信息。
接收方在接收到数据后,通过检查冗余信息来检测和纠正错误。
前向纠错码具有较高的纠错能力,能够在传输过程中实时检测和纠正错误,从而提高数据传输的可靠性。
五、哈希校验哈希校验是一种通过哈希函数计算校验和来检测错误的差错检验技术。
发送方在传输数据之前,使用哈希函数计算数据的校验和,并将其附加在数据后面一起传输。
接收方在接收到数据后,再次使用哈希函数计算数据的校验和,并与接收到的校验和进行比较。
如果两者一致,则说明数据传输没有出错。
六、重发机制重发机制是一种在数据传输中常用的差错检验技术。