【校验码】奇偶校验码、循环冗余校验码CRC、海明校验码

校验码

导航

  • 1. 校验码
  • 2. 码距
  • 3. 奇偶校验码
  • 4. 循环冗余校验码CRC
  • 5. 海明校验码
  • 总结

1. 校验码

  • 定义:校对检验编码。用于验证数据完整性和准确性的技术
  • 实现原理:通过加冗余码,用于在传输或存储过程中检测错误或篡改
  • 目的:当数据从一个地方传输到另一个地方时,可能会受到各种干扰,比如噪音、信号衰减、数据损坏、恶意攻击者篡改数据。

2. 码距

  • 单个编码的码距为1

例如:编码A是00,因为其只需要改变一位就变成另一个编码,所以码距为1

  • 两个编码中,从A码到B码转换所需要改变的位数称为码距
    (两个编码在相同位置上有多少个元素不同,码距就是几)

例如:编码A是101010,编码B是111000,在相同位置上有2个元素值不同,所以码距为2

  • 码距越大,越利于纠错和检错

较大的码距意味着两个序列之间的差异较大,即在更多的位置上存在不同的元素。在错误检测和纠错编码中,通过使用码距较大的编码方案,可以提供更强大的纠错能力。

冗余位的添加是基于码距的概念,通过增加冗余位,从而增加码距,使得在一定范围内的错误能够被检测和纠正。

3. 奇偶校验码

在编码中增加1位校验位来使编码中1的个数为奇数 (奇校验)或者偶数(偶校验),从而使码距变为2
在这里插入图片描述

  • 奇校验:编码中有奇数个1,发送给接收方,接收方收到后,会计算收到的编码有多少个1,如果是奇数个,则无误,是偶数个,则有误
  • 偶校验:编码中有偶数个1
  • 奇偶校验只能检测1位错,无法检查出偶数个错误,并且无法纠错

假设计算机规定好的是奇校验,发送方发送的编码是01101 0,而接收方收到的是11111 0,但是奇数个1,符合奇校验,但有两个0变成了1,所以奇偶校验只能检测出1位错误,且没法纠错。

4. 循环冗余校验码CRC

只能检错,不能纠错

原理:发送方和接收方事先约定一个生成多项式G(x),将原始报文除以多项式生成的除数,将所得的余数作为校验位加在原始报文之后,作为发送数据发给接收方

即循环冗余校验码CRC由两部分组成,K位信息码(原始数据)+ R位校验码
校验码是由信息码产生的,校验码位数越长,校验能力越强

例如:原始报文为11001010101,其生成多项式为:x4+x3+x+1,对其进行CRC编码后的结果为?

  • 构造被除数多项式的最高幂为几,就在原始报文的末尾加几个0
    多项式 x4+x3+x+1的最高次幂是4,所以在原始报文11001010101后面加4个0,即110010101010000
  • 构造除数由高次幂到低次幂,有幂指数的则为1,无幂则为0
    x4、x3、x(x1)、1(x0)都有幂指数,但没有x2。所以,从左往右,从高幂到低幂写,除数为11011
  • 模2整除按位运算,不发生借位和进位,而是异或运算;商一直上1,不需要管是0还是1;余数的位数应与多项式的最高次数相同,如果位数不够则在余数前面补0
  • 最终得到四位数的余数:0011,所以在原始报文11001010101后面加上余数0011,得到110010101010011,并发送出去。
  • 接收方将收到的数据110010101010011与多项式的11011进行模2运算,若余数为0,说明校验正确,数据传输正确。
         ---------------------
11011  |   110010101010000         
           11011
          ---------------
              10010 (异或运算,同01,最高位得到1则停止,后面从被除数补足与除数相同的位数)
              11011
            ---------------
               10011
               11011
              ---------------
                10000
                11011
                ---------------
                 10111
                 11011
                ---------------
                  11000
                  11011
                 ---------------
                     11000
                     11011
                  ---------------
                      0011

从网上拉了个图(from imByte),更加清楚

例如:待发送的信息为101001,生成多项式为G(x)= x 3+ x2+ 1,计算余数
【校验码】奇偶校验码、循环冗余校验码CRC、海明校验码_第1张图片
例如:接收到的信息为101101001,生成多项式为 G(x)= x3+ x2+ 1,判断传输是否误码?

【解析】接收到的信息作为被除数,多项式不变构造除数,做除法运算,如果得到的余数为0,表示数据传输正确。
【校验码】奇偶校验码、循环冗余校验码CRC、海明校验码_第2张图片

【例题】循环冗余校验码 (cyclic Redundancy check ,CRC)是数据通信领域中最常用的一种差错校验码,该校验方法中,使用多项式除法(模2 除法) 运算后的余数为校验字段。若数据信息为n位,则将其左移k位后,被长度为k+1位的生成多项式相除,所得的k位余数即构成k个校验位,构成n+k位编码。若数据信息为1100,生成多项式为 x3+x+1 (即1011), 则CRC编码是 ( )

A.1100010
B.1011010
C.1100011
D.1011110

【答案】A

【解析】(1)在原始信息位后加k个000,即1100000 (2)将1100000与生成多项式1011做模2除法,得到余数为010 (3)将原始信息位与余数连接起来得到: 1100010
ps:将数据信息左移k位是指在数据信息位后面添加k个0

5. 海明校验码

本质也是利用奇偶性来检错和纠错的检验方法,构成方法是在数据位之间的确定位置上插入k个校验位,通过扩大码距实现检错和纠错。

设数据位是n位,校验位是k位,则n和k必须满足以下关系: 2k>= n + k + 1(已知信息位有多少,求校验位位数)

例如:求信息位1011的校验位数

【解析】数据位有4位,2 k ≥ 5 + k,k = 3,所以校验位有3位

例如:求信息1011的海明码

(1)确定校验位的位数和具体位置

  1. 编号:从最低位编号,从1开始递增
  2. 确定校验位的位置:校验位处于2的n次幂( n = 0 1 2…)的位置上 ,即处于第1、2、4、8、16、32…位上
  3. 填充数据位(信息位):其余位填充真正的数据位(信息位)

该题中,信息数据为1011,先确定第1、2、4位为校验位,后填充第3、5、6、7位为数据位(信息位只有4位),用来从数据位低位开始存放1011

7 6 5 4 3 2 1 位数
I4 I3 I2 I1 信息位
r2 r1 r0 校验位
7 6 5 4 3 2 1 位数
1 0 1 1 信息位
r 2 r 1 r 0 校验位

(2)计算校验位

  1. 信息位所在的编号拆分成校验位所在的编号,目的是看第几位数是由哪些校验位校验的
  • 7 = 4 + 2 + 1,即第7位信息位是由第4位校验位(r2)和第2位校验位(r1)和第1位校验位(r0)共同校验的
  • 6 = 4 + 2,即第6位信息位是由第4位校验位(r2)和第2位校验位(r1)共同校验的
  • 5 = 4 + 1,即第5位信息位是由第4位校验位(r2)和第1位校验位(r0)共同校验的
  • 3 = 2 + 1,即第3位信息位是由第2位校验位(r1)和第1位校验位(r0)共同校验的
  1. 分别求第4位校验位(r2)和第2位校验位(r1)和第1位校验位(r0)的值
    有出现的地方,进行异或运算
  • 第4位校验位校验第7、6、5三位数据位,因此,第4位校验位r2 = 这三位数据位的值异或
    第4位校验位r2 = 1 ⊕ 0 ⊕ 1 = 1 ⊕ 1 = 0

  • 第2位校验位校验第7、6、3两位数据位,因此,第2位校验位r1 = 这三位数据位的值异或
    第2位校验位r1 = 1 ⊕ 0 ⊕ 1 = 1 ⊕ 1 = 0

  • 第1位校验位校验第7、5、3两位数据位,因此,第1位校验位r0 = 这三位数据位的值异或
    第1位校验位r0 = 1 ⊕ 1 ⊕ 1 = 1

计算出三个校验位后,数据位之间的确定位置上插入k个校验位后,可知最终要发送的海明校验码为1010101

7 6 5 4 3 2 1 位数
1 0 1 1 信息位
0 0 1 校验位

(3)检错和纠错原理
接收方收到海明码之后,会将每一位校验位其校验的位数分别异或,如果是偶校验,那么运算得到的结果应该全为0,如果是奇校验,应该全为1,才是正确。

假设是偶校验,且接收到的数据为1011101 (第四位出错,上文计算的海明校验码是1010101) ,说明接收方收到的校验位是101,而不是正确的001。

原始表格

7 6 5 4 3 2 1 位数
I4 I3 I2 I1 信息位
r2 r1 r0 校验位

后续表格(含错误的校验位)

7 6 5 4 3 2 1 位数
1 0 1 1 信息位
1 0 1 校验位

此时,运算的结果为:

r2 ⊕ I4 ⊕ I3 ⊕ I2 = 1 ⊕ 1 ⊕ 0 ⊕ 1 = 1
r1 ⊕ I4 ⊕ I3 ⊕ I1 = 0 ⊕ 1 ⊕ 0 ⊕ 1 = 0
r0 ⊕ I4 ⊕ I2 ⊕ I1 = 1 ⊕ 1 ⊕ 1 ⊕ 1 = 0

这里不全为0,表明传输过程有误,并且按照r2 r1 r0排列为二进制100这里指出的就是错误的位数,表示第100,转化为十进制是4,即第4位出错,找到了出错位,纠错方法就是将该位逆转,所以第4位校验码变为0即可。ps:进制之间的转换

总结

奇偶校验码就是在原始信息位后面加1个校验位
循环冗余码CRC就是在原始信息位后面加R个校验位
海明校验码就是在原始信息位之间插入K个校验位

你可能感兴趣的:(#,计算机组成结构,开发语言,c语言,软件工程)