本文主要是介绍第一章 计算机硬件基础知识(校验码--奇偶校验、海明码、CRC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
数据校验的基本原理
数据校验的基本原理是在正常编码中加入一些冗余位,即在正常编码组中加入一些非法编码,当合法数据编码出现某些错误时,就成为非法编码,因此就可以通过检测编码是否合法来达到自动发现、定位乃至改正错误的目的。
码距:两个码字之间不同的二进制位数。假设我们有两个四位二进制,1111与1110,它们的码距便是1。因为只有最低位不同。
计算码距
计算0100和11111
①直接观察法:可以看出,有3个数位值,所以码距为3
②异或计算法:0100⊕1111=1011,这里面有几个1就代表有多少个数位值不同,这里码距是3
若码距=2,有检错能力;若码距≥3,可能还会有纠错能力
码距与检错/纠错的关系
码距越大,反映了码集中每两个码字之间的差别程度越大。那么从一个编码传输错误变成另一个编码的可能性越小。则其检错、纠错能力也就越强。
①码距≥e+1 (可检测e个错误)
②码距≥2t+1 (可纠正t个错误)
③码距≥e+t+1(可纠正t个错误,同时检测e个错误)
奇偶校验
奇偶检验是一种差错检测技术,主要用于检测数据传输中是否发生错误。
奇校验:数据位+校验位 总共有奇数个1
偶检验:数据位+校验位 总共有偶数个1
奇校验码
奇校验码在数据发送前,检查1的个数,奇数个1就在头部填充0,偶数个1就在头部填充1,使数据整体保持奇数个1;
接收数据时,重新检查1的个数:
奇数则判定数据正常,去掉头部的填充符;
偶数个则判定数据出错,重新发送数据帧。
示例:假设数据单位为8位,并且使用奇校验。
数据 10110011
中有5个1,因此符合奇数要求,校验位为0。
偶校验码
偶校验码在数据发送前,也会检查1的个数,偶数个1就在头部填充0,奇数个1就在头部填充1,使数据整体保持偶数个1;
接收数据时,重新检查1的个数:
偶数个1则判定数据正常,去掉头部的填充符;
奇数个1则判定数据异常,重新发送数据帧。
示例:假设数据单位为8位,并且使用偶校验。
数据 11001010
中有4个1,不符合奇数要求,校验位为1。
海明码
海明码具有一位纠错能力。
海明码检错/纠错基本思想。
海明码(Hamming Code)是一个可以有多个校验位,具有检测并纠正一位错误代码的纠错码。
它的检错/纠错思想:
①将有效信息按某种规律分成若干组,每组安排一个校验位通过异或运算进行校验,得出具体的校验码
②在接收端同样通过异或运算看各组校验结果是否正确,并观察出错的校验组,或者多个出错的校验组的共同校验位,得出具体的出错比特位
③对错误位取反来将其纠正
海明码计算
步骤:计算校验码位数→确定校验码位置→确定校验码
①计算校验码位置
假设用N表示添加了校验码位后整个传输信息的二进制位数,用K代表其中有效信息位数,r表示添加的校验码位数,它们之间的关系应满足:N=K+r≤-1(是为了确保r位校验码能校验全部的数据位,因为r位校验码所能表示的最大十进制数为2r-1,同时也确保各位码本身不被其他校验码校验)
设有数据为8位,那么 2⁴-1=15>8+4=12,则校验位为4位,即这个海明码长12位
②确定校验码位置
海明码的校验码的位置必须是在位置(n从0 开始,分别代表从左边数起分别是第1、2、4、8、16……),信息码也就是在非位置
令信息位为D7,D6,D5,D4,D3,D2,D1,D0,信息位从高往低占据编码位;
令校验位为P3,P2,P1,P0,校验位P0=2⁰=1,P1=2¹=2,P2=2²=4,P3=2³=8;
位数 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
信息位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | ||||
校验位 | P3 | P2 | P1 | P0 |
③确定校验码
信息位的位数=校验位组的位数之和
信息位D7的位数为12,12=8+4,所以D7的校验位组为P3(位数:8)和P2(位数:4)
信息位 | 位数校验计算 | 校验位组 |
D7 | 12=8+4 | P3,P2 |
D6 | 11=8+2+1 | P3,P1,P0 |
D5 | 10=8+2 | P3,P1 |
D4 | 9=8+1 | P3,P0 |
D3 | 7=4+2+1 | P2,P1,P0 |
D2 | 6=4+2 | P2,P1 |
D1 | 5=4+1 | P2,P0 |
D0 | 3=2+1 | P1,P0 |
由上表可得,P0参与了D0,D1,D3,D4,D6的检验,其他由此类推
P0=D0⊕D1⊕D3⊕D4⊕D6
P1=D0⊕D2⊕D3⊕D5⊕D6
P2=D1⊕D2⊕D3⊕D7
P3=D4⊕D5⊕D6⊕D7
这样子就可以算出整个海明码的值了。
示例:设数据为01101001,求海明码。
数据位为8,则2⁴-1=15>8+4=12,则校验位为4位,即这个海明码长12位;
D7D6D5D4D3D2D1D0=01101001;
P0=2⁰=1,P1=2¹=2,P2=2²=4,P3=2³=8;
P0=D0⊕D1⊕D3⊕D4⊕D6=1⊕0⊕1⊕0⊕1=1
P1=D0⊕D2⊕D3⊕D5⊕D6=1⊕0⊕1⊕1⊕1=0
P2=D1⊕D2⊕D3⊕D7=0⊕0⊕1⊕0=1
P3=D4⊕D5⊕D6⊕D7=0⊕1⊕1⊕0=0
则海明码为011001001101
CRC
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。
其根本思想就是先在要发送的帧后面附加校验码,再发送给接收端。校验码要使所生成的码能与发送端和接收端共同选定的某个特定数整除(模2除)。到达收端后,再把接收到的新帧除以这个选定的除数。结果应该是没有余数,如果有余数,则表明该帧在传输过程中出现了差错。
示例:CRC生成的多项式为G(x)=++x+1,要求写出二进制序列101100的CRC校验码。
①将G(x)多项式转化成二进制序列,由G(x)=++x+1,可以得到序列1111
②多项式的位数为4位,则在二进制序列后面加(4-1)个0,变成101100000
③然后使用模2除法除以除数(模2除法: 被除数第一位为1的话商写1并用按位进行异或运算 被除数第一位为0的话商写0并且进行异或运算)
1 1 1 0 0 1 // 商
------------------------
1111|1 0 1 1 0 0 0 0 0 // 被除数,因为首位为1,所以商第一位写1
/ 1 1 1 1 // 除数,因为被除数首位为1,所以用除数进行除
-----------------------
1 0 0 0 // 被除数,从上面进行模2加减法得到的
1 1 1 1 // 因为被除数首位为1,所以商第二位写1
-----------------------
1 1 1 0 // 被除数,从上面进行模2加减法得到的
1 1 1 1 // 除数,因为被除数首位为1,所以用除数进行除
-----------------------
0 0 1 0 // 被除数,从上面进行模2加减法得到的
0 0 0 0 // 除数,因为被除数首位为0,所以用除数进行除
-----------------------
0 1 0 0 被除数,从上面进行模2加减法得到的
0 0 0 0 // 除数,因为被除数首位为0,所以用除数进行除
-----------------------------
1 0 0 0 // 被除数,从上面进行模2加减法得到的
1 1 1 1 // 除数,因为被除数首位为1,所以用除数进行除
-------------------------------
1 1 1 // 余数
④将计算出来的CRC检验码添加在原始码的后面,即101100111,把这个数据发送到接收端。
④接收端收到数据帧后,模2除1111,验证余数是否为0,如果为0,则说明数据帧没有出错。
这篇关于第一章 计算机硬件基础知识(校验码--奇偶校验、海明码、CRC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!