校验码
计算机系统运行时,各个部件之间要进行数据交换,为了确保数据在传递的过程种正确无误,一是提高硬件电路的可靠性;二是提高代码的校验能力,包括查错和纠错。所以说校验码是一种用于检测或纠正数据传输或存储过程中可能出现的错误的数据编码方法。以下是三种常见的校验码:奇偶校验码、海明码和循环冗余校验码(CRC)的详细介绍。
1. 奇偶校验码
定义与作用: 奇偶校验码是一种简单有效的检错码,用于检查二进制数据的位错。它通过增加一个校验位来使数据中的1的个数为奇数(奇校验)或偶数(偶校验)。
工作原理:
- 奇校验:在发送数据前,检查数据中1的个数,如果是偶数,则在校验位填充1,使总数为奇数;如果是奇数,则填充0。接收方收到数据后,重新检查1的个数,若为奇数则判定数据正常,若为偶数则判定数据出错。
- 偶校验:原理与奇校验相反,确保数据中1的个数为偶数。
缺点: 奇偶校验码只能检测出奇数位错误,无法确定错误的具体位置,且无法纠正错误。此外,当两个或更多位同时出错时,可能会漏检。
表1-8 8421码的奇偶校验码 | |||
十进制数 | 8421BCD码 | 带奇校验码的8421码 | 带偶校验码的8421码 |
0 | 0000 | 0000 1 | 0000 0 |
1 | 0001 | 0001 0 | 0001 1 |
2 | 0010 | 0010 0 | 0010 1 |
3 | 0011 | 0011 1 | 0011 0 |
4 | 0100 | 0100 0 | 0100 1 |
5 | 0101 | 0101 1 | 0101 0 |
6 | 0110 | 0110 1 | 0110 0 |
7 | 0111 | 0111 0 | 0111 1 |
8 | 1000 | 1000 0 | 1000 1 |
9 | 1001 | 1001 1 | 1001 0 |
解释 | 以上1的数量为奇数 | 以上1的数量为偶数 |
从表1-8 可知,带奇偶校验码的8421码由4位信息位和1位校验位组成,码距为2,能检查出代码信息种奇数位出差的情况,而错在那些位是检查不出来的。也就是说,它只能发现错误,而不能校正错误。
码距:指一个编码系统中任意两个合法编码之间至少有多少个二级制位不同,例如,4位8421码的码距为1。
常用的奇偶校验码有3种:水平奇偶校验码、垂直奇偶校验码和水平垂直校验码。
- 水平奇偶校验码:对每一个数据的编码添加校验位,使信息位与校验位处于同一行。
- 垂直奇偶校验码:这种校验码把数据分成若干组,一组数据占一行,排列整齐,再加一行校验码,针对每一列采用奇校验或偶校验。
【例1-10】对于32位数据 10100101 00110110 110011100 10101011,其垂直奇校验和垂直偶校验如下所示。
编码分类 | 垂直奇校验码 | 垂直偶校验码 |
数据 | 1 0 1 0 0 1 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 | 1 0 1 0 0 1 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 |
校验码 | 0 0 0 0 1 0 1 1 | 1 1 1 1 0 1 0 0 |
- 水平垂直校验码:在垂直校验码的基础上,对每个数据再增加一位水平校验码,便构成水平垂直校验码。
【例1-11】对于32位数据 10100101 00110110 110011100 10101011,其水平奇校验和偶校验如下所示。
奇偶类 | 水平垂直奇校验码 | 水平垂直偶校验码 | ||
分类 | 水平校验位 | 数据 | 水平校验位 | 数据 |
数据 | 1 1 1 0 | 1 0 1 0 0 1 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 | 0 0 0 1 | 1 0 1 0 0 1 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 |
垂直校验位 | 0 | 0 0 0 0 1 0 1 1 | 1 | 1 1 1 1 0 1 0 0 |
2.海明码
定义与作用: 海明码是一种能够检测并纠正错误的校验码,它是奇偶校验码的一种扩充。海明码通过在数据中加入多个校验位,并利用这些校验位的不同组合来定位并纠正错误。
海明码:也是利用奇偶性来检错和纠错的校验方法。海明码的构成方法是:在数据位之间插入k个校验码,通过扩大码距来实现检错和纠错
工作原理:
- 校验位分布:海明码的校验位被放置在特定的位置上,通常是2的幂次方减1的位置(如1、2、4、8等位)。
- 校验位计算:每个校验位负责校验一组特定的数据位,这些数据位在其二进制表示中对应于校验位所在位的位值为1。例如,校验位P1负责校验所有末位为1的数据位,P2负责校验所有次末位为1的数据位,以此类推。
- 错误检测与纠正:接收方通过计算各校验位的异或值来检测错误,并根据错误的校验位组合确定错误的位置,进而纠正错误。
例如,对于8位数据位,进行海明校验需要4个校验码。令数据位为、、、、、、、,校验位为、、、,形成的海明码为、、…、、、,
(1)首先确定数据位与校验位在海明码中的位置,如下所示。
校验码设置在位置,因此对应对应,对应,对应。
每个检验码只校验数据位中位置号的二进制编码和自身位置的二进制编码相匹配的数据位。
例如,()的位置号为7(=4+2+1),因此该数据位有,,校验。
(2)通过校验关系,确定各校验位的值。
化几隔几:一般是1,2,4,8,……
化一隔一:、、、、、间隔一个选一个。
偶检验码:、、、、、
即=⊕⊕⊕⊕
化二隔二:、、、、、间隔两个选两个。
即=⊕⊕⊕⊕
化四隔四:、、、、间隔四个选四个。
即=⊕⊕⊕
化八隔八:、、、、间隔八个选八个。
即=⊕⊕⊕
若采用奇校验码,则将各校验码的偶校验码值取反即可。
(3)检查错误。对使用海明编码的数据进行查错检测很简单,只需要以下计算:
=⊕⊕⊕⊕⊕
=⊕⊕⊕⊕⊕
=⊕⊕⊕⊕
=⊕⊕⊕⊕
若采用偶校验,则全为0时表示接收到的数据无错误(奇校验则应全为1)。当不全为0说明发生了差错,而且的十进制值指出发生错误的位置。
例如=1010,说明()出错了,将其取反即可纠正错误。
【例1-12】设数据为0110 1001 ,试采用4个校验位求其偶校验方式的海明码。
解:=0110 1001,根据公式
=⊕⊕⊕⊕=1⊕0⊕1⊕0⊕1=1
=⊕⊕⊕⊕=1⊕0⊕1⊕1⊕1=0
=⊕⊕⊕=0⊕0⊕1⊕0=1
=⊕⊕⊕=0⊕1⊕1⊕0=0
因此,求的海明码为:
0 1 1 0 0 1 0 0 1 1 0 1
3.循环冗余校验码(CRC)
定义与作用: 循环冗余校验码是一种具有很强检错和纠错能力的校验码,常用于外存储器和计算机同步通信的数据校验。它通过某种数学运算(如模2除法)建立数据位和校验位之间的约定关系。
它利用生成多项式个数据位产生个校验位来进行编码,其编码长度位。CRC的代码格式为:
n | n-1 | … | r+1 | r | r-1 | … | 2 | 1 |
… | … | |||||||
数据位 | 校验位 |
由此可知,循环冗余校验码是由两部分组成的,左边位信息码(数据),右边为校验码。若信息码占k位,则校验码就占n-k位。其中,n为CRC码的字长,所有又称为(n,k)码。检验码是由信息码产生的。校验码位数越长,该代码的校验能力就越强。在求CRC编码时,采用的是模2运算。
模2加减运算的规则是:按位运算,不发生借位和进位,如下所示:
0+0=0 | 1+0=1 | 0+1=1 | 1+1=0 |
0-0=0 | 1-0=1 | 0-1=1 | 1-1= |
工作原理:
- 生成多项式:首先约定一个生成多项式G(x),它是一个k+1位的二进制数。
- 数据左移与除法:将原始信息M(x)左移r位(r为生成多项式的阶),然后用G(x)去除,得到的余数即为CRC校验码。
- 校验:接收方收到数据后,用同样的生成多项式G(x)去除,如果余数为0,则数据无误;否则,数据出错。
检错与纠错能力: CRC码能够检测出所有奇数位错、所有双比特错以及所有小于、等于校验位长度的突发错。但是,CRC码本身并不具备纠错能力,只能要求发送方重传出错的数据。
综上所述,奇偶校验码、海明码和循环冗余校验码各有其特点和应用场景。奇偶校验码实现简单但功能有限;海明码能够检测并纠正一位错误,适用于对可靠性要求较高的场合;CRC码则以其强大的检错能力在通信和数据存储领域得到广泛应用。