校验码——揭开海明校验码求解之谜
来源:互联网 发布:java实现弹出窗口保存 编辑:程序博客网 时间:2024/06/10 07:45
引言
计算机系统在运行时,各个部件之间要进行数据交换,为了确保数据在传送过程中正确无误,通常使用校验码的方法来检测传送的数据是否出错。合理的设计错误编码以及编码规则,舍得数据在传送中出现某种错误时会变成错误编码,这样就可以检测出接收到的数据是否有错。
校验码
通常是一组数字的最后一位,由前面的数字通过某种运算得出,用以检验该组数字的正确性。常见的校验码有中华人民共和国居民身份证的最后一位、ISBN号码的最后一位、组织机构代码的最后一位、数据传输的正确性验证码等。
书上介绍了三种校验码:奇偶校验码、海明校验码和循环冗余校验码。
奇偶校验码:通过在编码中增加一位校验位来使编码中1的个数为奇数或者为偶数,从而使码距变为2。对于奇校验,可以检测出代码中奇数位出错的代码,但是不能发现偶数位出错的情况。常用的有三种:水平奇偶校验码、垂直奇偶校验码和水平垂直校验码。
循环冗余校验码:利用生成多项式为k个数据位产生r个校验位来进行编码,其编码长度为k+r。在求CRC编码时,采用的是模2运算。(加减运算的规则是按位运算,不发生借位和进位。)
这里我们主要介绍一下海明校验码。之前视频中也讲过海明校验码,但是看完视频就蒙了,想着反正我们的学习是反复的,现在什么都不懂没事,先知道有这么个高大上的东西,之后还是会遇到的。然后再看书专项复习阶段,又遇到了,研究一下,通过视频中的例子来给大家分享。
海明校验码
视频中的例子:求信息1011的海明码。
首先,我们要知道海明校验码的实现原理:在K个数据位之外加上r个校验位,从而形成一个K+r位的新的码字,使新的码字的码距比较均匀的拉大。
步骤:
1、根据信息位,确定校验位数
根据公式2^r≥k+r+1,其中k为信息位,r为校验位数。因为1011共四位,所以k=4,求得r最小应该是3.
由于信息位和校验位一共是7位,所以海明码的位数是7位,由此确定初步的表格:
位数
1
2
3
4
5
6
7
信息位
校验位
2、分配校验位和信息位
2.1分配校验位
因为校验位位置分配的规律是一般都放置在2^n上,也就是1、2、4、8……位置。得到如下的表格:
位数
1
2
3
4
5
6
7
信息位
校验位
R1
R2
R3
2.2分配信息位
信息位的位置分配是从高位到低位依次存放。得到如下的表格:
位数
1
2
3
4
5
6
7
信息位
1
1
0
1
校验位
R1
R2
R3
注意:信息位从高位到低位依次排列,如果该位置被校验位占据之后就往后移,直到没有被占据的空位。
3、确定校验位的值
想要确定校验位的值,那我们就应该知道上面的信息位都是由哪几个校验位来进行校验的。
校验原则:被校验的海明位的下标等于所有参与校验该为的校验位的下标之和。即想要校验的信息位的位置(i)等于校验位的位置值相加。例如:我们要校验第三位,3=2+1,也就是用R1和R2来校验第3位。
由此原则得到每一个位置相对应的校验位表:
海明码
海明码的下标
校验位组
1
1
R1
2
2
R2
3
3=2+1
R1,R2
4
4
R3
5
5=4+1
R3,R1
6
6=4+2
R3,R2
7
7=4+2+1
R3,R2,R1
通过上面的表,我们知道了每一个校验码对应的校验的信息位:
校验码名称
校验的信息位
R1
1,3,5,7
R2
2,3,6
R3
4,5,6,7
4、求校验位的值
通过以上的表,我们根据每个校验位校验的信息位的值进行异或运算,得出每个校验位的值。
异或运算:异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
即如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
例如:求R1的值
我们从以上的表中得知:R1是用来校验1、3、5、7位的。而1对应的信息位是空的,3、5、7对应的信息位都是1。
由此得出R1=1
同理求出R2=0,R3=0
5、将整个表补齐
位数
1
2
3
4
5
6
7
信息位
1
1
0
1
校验位
R1=1
R2=0
R3=0
将上面的数按照从低位到高位的排列顺序得到:1010101,就是我们要的海明码。
6、海明校验码的规律:
通过上面的表,我们知道一个信息位会被多个校验位进行校验,所以当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错了,为进一步自动纠错提供了依据。
小结
有的时候我们就是应该将自己现在不懂的内容先放一下,因为我们会进行反复的学习,现在不懂只是因为我们还没到那个点上,要相信,终有一个点,我们会大彻大悟!
上面的内容虽然步骤可以整出来,但是有好多的名词有点疑惑,所以如果有问题,还请大家斧正!
- 校验码——揭开海明校验码求解之谜
- 海明校验码——如何求解
- 常用校验码(奇偶校验码、海明校验码、CRC校验码)
- 常用校验码(奇偶校验码、海明校验码、CRC校验码)
- 常用校验码(奇偶校验码、海明校验码、CRC校验码)
- 常用校验码(奇偶校验码、海明校验码、CRC校验码)
- 常用校验码(奇偶校验码、海明校验码、CRC校验码)
- 软考——海明校验码
- 海明校验码——确定校验位
- 校验码之奇偶校验码
- 奇偶校验码,海明校验码 和 循环冗余校验码(CRC)
- 奇偶校验码,海明校验码 和 循环冗余校验码(CRC)
- 奇偶校验码、海明校验码 和 循环冗余校验码(CRC)
- 海明校验码之效验分析
- 海明校验码
- 海明校验码
- 海明校验码
- 海明校验码
- C语言程序初体验-第十一课-第四题:玩数字
- JFreeChart(四.折线图.1)
- Unity5.1.1 AssetBundle的相关理解
- createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
- hibernate总结-映射
- 校验码——揭开海明校验码求解之谜
- java的join和yield方法处理线程顺序执行
- 随即抽取的小程序
- Longest Consecutive Sequence
- Xcode多工程管理(给不知道的人)
- (已解决)Myeclipse jsp 引入css无效果
- 博客突破1000访问量
- 合纵连横 1022 (并查集) 好题
- GDataXMLNode