校验码——揭开海明校验码求解之谜

来源:互联网 发布: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、海明校验码的规律:

       通过上面的表,我们知道一个信息位会被多个校验位进行校验,所以当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错了,为进一步自动纠错提供了依据。

 

小结

       有的时候我们就是应该将自己现在不懂的内容先放一下,因为我们会进行反复的学习,现在不懂只是因为我们还没到那个点上,要相信,终有一个点,我们会大彻大悟!

       上面的内容虽然步骤可以整出来,但是有好多的名词有点疑惑,所以如果有问题,还请大家斧正!


0 0
原创粉丝点击