5.4 奇偶校验
奇偶校验是计算机中最常用的一种验证数据的方法。由于它很简单,所以奇偶校验位用于许多计算机硬件中,当遇到麻烦时能够重新操作,或者通过简单的错误检测就能起到很大作用。例如SCSI总线使用奇偶校验位检测传输错误,许多微处理器的指令高速缓存中也包括奇偶校验位保护。因为指令缓存数据是主内存数据的副本,所以在发现错误的时候能够抛弃错误数据并且重新取回数据。
那么奇偶校验是什么原理呢?我们下面来研究一下。
5.4.1 不可靠的网络传输
现在我们天天都在使用网络传输数据,怎样确保传输的数据没有错误呢?
我们都知道,由于网络的情况复杂性,无论是有线、无线传输,都不能保证每次发送的数据会完整无误地传送到对方。
在网络中传送的都是二进制信息,可能会由于线路问题或外界电磁干扰等因素,使传送的二进制位出现错误,如将“1”错误传输为“0”,或将“0”传输为“1”。这种情况,我们称为出现了“误码”。
例如,通过网络传输一个字符E,这时就将这个字符的ASCII传送给对方,字符E的ASCII码为69,转化为2进制为:

由于存在误码,可能会将二进制数据中的一个“0”传为了“1”,得到以下二进制(从右向左第5位出了错误):

这时,本来传输的字符E就变成了字符U(字符U的ASCII码为85),传输就出错了。
5.4.2 用奇偶校验检查错误
既然网络中传输数据时容易出现误码,那么,该如何发现数据传输中的错误?最简单的检错方法是“奇偶校验”。
奇偶校验方法,是根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之称为偶校验。
在传送ASCII码字符时,使用这种奇偶校验是非常方便的,因为ASCII码中字符只占用了低7位的二进制,最高位的二进制一直为0。这时,可将这一位用来保存奇偶校验。
例如,若采用奇校验,当传输字符E时,由于该字符的ASCII码的二进制数中包含有3个二进制“1”,因此,最高位不用设置,仍然为“0”,使传输的8位二进制中“1”的数量为奇数。
若传输字符F时,由于该字符的ASCII码的二进制为:

字符G的二进制中有4个“1”,为偶数,在奇校验时,将这8位二进制中的最高位置为1,如下所示:

有了这个奇偶校验,接收方判断接收数据是否出错时就很简单了。例如,若接收方收到以下二进制:

可看出,二进制数据中“1”的个数为4,是偶数,说明接收的数据有误。
如果接收方接收到的数据中“1”的个数为奇数,说明接收的数据是正确的。这时,再将最高位置为0(即去掉最高位的奇校验数据),则可得到正确的数据。
上面的例子是采用奇校验时的情况,若采用偶校验,其校验方法类似,只是判断二进制数据中“1”的个数是否为偶数。至于采用奇校验还是采用偶校验,是由传输方和接收方事先规定好的。
可以看出,奇偶校验能够检测出信息传输过程中的部分误码,但是只能检查出一位误码,若在一个字节的传输过程中有两位及两位以上误码,就不能检验出了。
另外,奇偶校验只能用来发现错误但不能纠错。发现错误后,只能要求发送方重发。
可以看出,奇偶校验很简单,因此,在很多场合得到了广泛的使用,如前面说的网络传输数据。另外,在内存、硬盘保存数据等方面也得到了广泛应用。
在串行通信中,为了提高效率,奇偶校验位通常是由UART这样的接口硬件生成、校验的,在接收方,通过接口硬件中的寄存器的状态位传给CPU及操作系统。
错误数据的恢复通常是通过重新发送数据,这个过程通常由如操作系统输入输出程序这样的软件处理的。
