数据校验-奇偶校验码/海明码/循环冗余码

【前言】

数据在传输的过程中,会受到各种干扰的影响,如脉冲干扰,随机噪声干扰和人为干扰等,这会使数据产生差错。为了能够控制传输过程的差错,通信系统必须采用有效措施来控制差错的产生。

数据在传输过程中传输的都是0和1,传输时有最小的数据单位。A传给B一个数据单位时,B在接收了数据单位时面临两个问题:一是数据单位有没有错误(即检错),二是数据单位如果错了能不能纠正(即纠错)。所以,为了解决这个问题,数据单位中不能全部都是数据本身,还要包含其他帮助检错或纠错的东西,将这个数据单位称为校验码。

如果校验码无错,自然可以从校验码中取出数据。(发送端和接收端会事先约定好校验码中哪些位是数据)如果有错,且不能纠错,那么接收端当前接受的校验码就会被舍弃,请求发送端重传。

【奇偶校验码】

采用奇偶校验方式的校验码被称为奇偶校验码。假设奇偶校验码有n位,其中奇偶校验位占1位,信息位占n-1位。以8bit为例,奇偶校验位占1位且在最高位(在最低位也可),剩下7位为信息位。

奇校验,使得校验码中的1的个数为奇数。偶检验,使得校验码中的1的个数为偶数。

信息位为1001101,有4个1,采用奇校验,应该加个1(即校验位为1),使得校验码的1的个数为奇数。所以,采用奇校验时的校验码为11001101。同样的,采用偶校验时的校验码为01001101.

信息位为101 0111,则奇校验为0101 0111,偶检验为1101 0111

信息位为000 0000,则奇校验为1000 0000,偶校验为0000 0000

下面以奇校验为例。

若是在传输过程中,校验码有一位发生了改变,这个改变可能在信息位,也可能在校验位。注意,改变要么从0变1,要么从1变0。无论哪中改变,校验码中1的个数都会从奇数变为偶数。在接收端,检测接收到的校验码,发现1的个数为偶数,就表明这个数据出错了,也即有了检错能力,但是不能纠错,因为不知道是哪一位出错了。

如果校验码有两位发生改变呢,那么改变后校验码中1的个数仍为奇数,所以这时就不能检错。

对我们来说,是数1的个数来判断校验码是否出错了,对于计算机来说,是通过异或运算来判断1的个数。异或运算,相异为1,相同为0。

采用奇校验时,1的个数为奇数,将校验码的所有位作异或运算,那么得到的结果一定是1。反之,亦成立。

采用偶校验时,1的个数为偶数,将校验码的所有位作异或运算,那么得到的结果一定是0。反之,亦成立。

特点:只能检测奇数个位数改变的出错情况,不能纠错。奇校验不会产生全0校验码。

【海明码】

海明码又被称为汉明码,其实质是多重奇偶校验码。假设信息位有n位,信息位被分成多组,总计k个校验位,对每组进行偶校验。校验位的位置在整个校验码的二的幂次的位置,即1、2、4、8、16等位置处。其中n和k的关系为:

2^{k}\geq n+k+1

分别代入不同n,可得对应的k为:

以信息位1010为例,n=4,对应的k=3,也即校验码共有7位,校验码的第1、2、4位为校验位。这样得到了校验码的长度和校验位的位置,当前校验码为101?0??,随后要求校验位的值。注意计算机中低位在右边,高位在左边。

计算第一个校验码时(即第一组),从当前位开始,连续校验1位,跳过1位后,再连续校验1位,再跳过1位······也即选择第1、3、5、7位,其为011?这四位的采用偶校验的时,1的个数应该为偶数(异或运算结果应该为0),所以?=0。

计算第二个校验码时(即第二组),从当前位开始,连续校验2位,跳过2位后,再连续校验2位,再跳过2位······也即选择第2、3、6、7位,其为100?采用偶检验时,?=1。

计算第三个校验码时(即第三组),从当前位开始,连续校验4位,跳过4位后,再连续校验4位,再跳过4位·······也即选择第4、5、6、7位,其为101?采用偶校验时,?=0。

如此,求得了信息位1010的海明码为1010 010

随后要确定这个海明码经过传输后,接收到的数据是否无误,即如何校验海明码。

校验海明码和奇偶校验的方式类似,每组信息中一位是校验位,其他是数据位。

对第一组,通过对第1、3、5、7位进行异或运算,看结果是否为0。如果为0,表明这几位的数据没出错。

对第二组,通过对第2、3、6、7位进行异或运算,看结果是否为0。如果为0,表明这几位的数据没出错。

对第三组,通过对第4、5、6、7位进行异或运算,看结果是否为0。如果为0,表明这几位的数据没出错。

如果所有结果都为0,表明数据无误。如果结果有1,表明有误。也即可以检错。

假设有1位发生了错误,且错误在第6位,则第一组结果为0,第1、3、5、7位没有错误;第二组结果为1,第2或者6位错误;第三组结果为1,第4或者6位错误。可推知,第6位错误。也即有一位的纠错能力。(将三组结果逆序组合,结果为110,表示6,即第6位出错)(再次强调,计算机中高位在左边。)

(可以检错一位的数学证明还不清楚)

假设有2位发生了错误,且错误在第2位和第3位,则第一组结果为1,则第1、3、5、7位中有1位错误;第二组结果为0,没有错误;第三组结果为0,没有错误。因此,可以知道数据有错误,但不知道错误在哪。

特点:具有1位纠错能力和2位检错能力

【循环冗余码校验码CRC】

CRC的基本思想是:在发送端和接收端约定一个除数, 当接收端将校验码进行除法运算后得到的余数为0,则表示校验码无措,否则进行重传或纠错。

校验码包含K个信息位和R个校验位,R为除数的最高次幂,除数通常用一个生成多项式表示,例如生成多项式G\left ( x \right )=x^{3}+x^{2}+1表示除数为1101,R=3。

G\left ( \right )=1\cdot x^{3}+1\cdot x^{2}+0\cdot x^{1}+1\cdot x^{0}

假设信息位为101001,则校验码有9位,低三位为校验位,初始值为0,随后用除数进行模2除法获得余数,余数为校验码的值,则校验码为101001 001

数据校验-奇偶校验码/海明码/循环冗余码_第1张图片

假设9位中任意一位发生错误,则都会得到一个确定的余数,当选择合适的生成多项式时,会使得余数各不相同,因此发生错误的位数和余数可以建立一一对应的关系,能进行1位纠错。

CRC是普遍采用的检错方式,其理论上

1)可检测出所有奇数个错误;

2)可检测出所有双比特的错误;

3)可检测出所有小于等于校验位长度的连续错误;

4)以相当大的概率检测出大于校验位长度的连续错误

【参考】

https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E6%A0%A1%E9%AA%8C

《计算机组成原理》

https://baike.baidu.com/item/%E5%BE%AA%E7%8E%AF%E5%86%97%E4%BD%99%E7%A0%81

你可能感兴趣的:(计算机基础,数据校验,奇偶校验,海明码,循环冗余码)