你看得懂的海明码校验和纠错原理(二)

简介:

接上篇:http://winda.blog.51cto.com/55153/1068000 

    以下内容摘自笔者即将出版的最新著作《深入理解计算机网络》一书。本书将于12月底出版上市,敬请留意!!

     本书原始目录:http://winda.blog.51cto.com/55153/1063878

4.    实现校验和纠错

    虽然上一步已把各位校验码求出来了,但是如何实现检测出哪一位在传输过程中出了差错呢?(海明码也只能检测并纠正一位错误)它又是如何实现对错误的位进行纠正呢?其实最关键的原因就是海明码是一个多重校验码,也就是码字中的信息码位同时被多个校验码进行校验,然后通过这些码位对不同校验码的联动影响最终可以找出是哪一位出错了。

1)海明码的差错检测

    现假设整个码字一共是18位,根据表5-1可以很快得出,其中有5位是校验码,再根据本节前面介绍的校验码校验规则可以很快得出各校验码所校验的码字位,如表5-2所示。

5-2  各校验码校验的码位对照表

    从表中可以得出以下两个规律:

l  所有校验码所在的位是只由对应的校验码进行校验,如第1位(只由p1校验)、第2位(只由p2校验)、第4位(只由p3校验)、第8位(只由p4校验)、第16位(只由p5校验),……。也就是这些位如果发生了差错,影响的只是对应的校验码的校验结果,不会影响其它校验码的校验结果。这点很重要,如果最终发现只是一个校验组中的校验结果不符,则直接可以知道是对应校验组中的校验码在传输过程中出现了差错

l  所有信息码位均被至少两个校验码进行了校验,也就是至少校验了两次。查看对应的是哪两组校验结果不符,然后根据表5-2就可以很快确定是哪位信息码在传输过程中出了差错。

海明码校验的方式就是各校验码对它所校验的位组进行“异或运算”,即:

G1=p1b1b2b4b5⊕……

G2=p2b1b3b4b6b7b10b11⊕……

G3= p3b2b3b4b8b9b10b11⊕……

G4= p4b5b6b7b8b9b10b11⊕……

G5= p5b12b13b14b15b16b17b18b19b20b21b11b23b24b25b26⊕……

    正常情况下(也就是整个码字不发生差错的情况下),在采用偶校验时,各校验组通过异或运算后的校验结果均应该是为0,也就是前面所说的G1G2G3G4,……均为0,因为此时1为偶数个,进行异或运算后就是0;而采用奇校验时,各组校验结果均应是为1

    现在举一个例子来说明,假设传输的海明码为111000111101(一共12位,带阴影的4位就是校验码),从中可以知道它有四个校验组:G1G2G3G4,然而到达接收端经过校验后发现只有G4=1(也就是只有这组校验结果不等于0),通过前面介绍的校验规律可以很快地发现是G4校验组中的p4校位码(也就是整个码字中的第8位)错了(因为只有一组校验结果出现差错时,则肯定只是对应的校验位出了差错),也就是最终的码字变成了:111000001101

    再假设G3G4两个校验值都不为0,也就是都等于1。通过表5-2中比较G3G4两个校验组(注意本示例中码字长度一共才12位,只需要比较前12位)中共同校验的码位可是以很快发现是b8,也就是第12位出现了差错,也就是最终的码字变成了:111000011100

    【经验之谈】在这里一定要注意,最终有多少个校验组出现差错也不是随意的,一定要结合实际传输的码字长度来考虑。如上例是一共12位,如果换成了是16位的码字,且当b9位出现差错时,则G1G3G4一定会同时出现错误,因为b9这个位是三个校验组同时校验的,只要它一出错,肯定会同时影响这三个校验组的值。同理,如果是b11位出现了差错,因为它同时受G1G2G3G4四个校验组校验,所以这四个校验组结果都将出现错误。

    2)海明码的差错纠正

    检测出了是哪位差错还不够,因为海明码具有纠正一位错误的能力,所以还需要完成纠错过程。这个过程的原理比较简单,就是直接对错误的位进行取反,或者加“1”操作,使它的值由原来的“1”变成“0”,由原来的“0”变成“1”(因为二进制中每一位只能是这二者之一)。

    以上就是海明码的整差错检测和差错纠正原理了,确实比单纯的奇偶校验码复杂些,但只要理清了思路,也还是比较简单的。

本文转自王达博客51CTO博客,原文链接http://blog.51cto.com/winda/1072629如需转载请自行联系原作者


茶乡浪子

相关文章
【密码学】一文读懂SHAMIR门限方案
【密码学】一文读懂SHAMIR门限方案
1028 0
|
3天前
|
传感器 C++
计算机网络:数据链路层之差错控制、奇偶校验码、CRC循环冗余码、海明码
计算机网络:数据链路层之差错控制、奇偶校验码、CRC循环冗余码、海明码
|
7月前
|
索引
海明校验码检错和纠错的工作原理
海明校验码检错和纠错的工作原理
78 0
<<计算机网络>>差错控制---奇偶效验码/循环冗余码ORC/海明码
<<计算机网络>>差错控制---奇偶效验码/循环冗余码ORC/海明码
137 0
<<计算机网络>>差错控制---奇偶效验码/循环冗余码ORC/海明码
|
存储
【锟斤拷�⊠是怎样炼成的】——两分钟帮你彻底弄懂计算机的编码原理
【锟斤拷�⊠是怎样炼成的】——两分钟帮你彻底弄懂计算机的编码原理
144 0
|
传感器 网络架构
3.1.1计算机网络(数据链路层 差错控制 循环冗余码 海明码 流量控制)
数据链路层 数据链路层基本概念 数据链路层功能概述 封装成帧 透明传输 组帧的四种方法: 1.字符计数法 ​2.字符填充法 ​3.零比特填充法 4.违规编码法 差错控制 差错从何而来? 数据链路层的差错控制​ 检错编码 1.奇偶校验码 2.CRC循环冗余码 纠错编码-海明码 1.确定校验码位数r 2.确定校验码和数据的位置 3.求出校验码的值 4.检错并纠错​ 流量控制与可靠传输机制 数据链路层的流量控制 流量控制的方法 可靠传输、滑动窗口、流量控制
3.1.1计算机网络(数据链路层 差错控制 循环冗余码 海明码 流量控制)
|
安全 算法 Java
[超长文,谨入]一文解决面试、工作遇到的安全性问题
安全问题其实是很多程序员容易忽略的问题但需要我们重视起来,提高应用程序的安全性。常出现的安全问题包括,程序接受数据可能来源于未经验证的用户,网络连接和其他不受信任的来源,如果未对程序接受数据进行校验,则可能会引发安全问题等等
283 0
[超长文,谨入]一文解决面试、工作遇到的安全性问题
|
算法 安全 区块链
加密,编码三问
网络通信中最重要的就是数据部分,而保证数据的正确安全传输,就要牵扯到数据的编码和数据的加密问题,今天的三问就是关于编码和加密:
102 0
已知数据信息为 16位,最少应附加( )位校验位,以实现海明码纠错。
已知数据信息为 16位,最少应附加( )位校验位,以实现海明码纠错。
381 0