计算机系统在进行数据的传输和存储时,难免会发生错误。为了避免这种错误,一方面是从硬件的方面着手,提高硬件的抗干扰能力和可靠性;而另一方面在数据编码上采取编码纠码的措施,使得机器能够自己发现错误甚至纠正错误,我们把这种具有检测错误或带有自动纠错能力的数据编码称为数据校验码。其原理是在数据中加入一些校验位,组成数据校验码,通过检查数据校验码的合法性来判断是否出错或进行纠错。常用的数据校验码有奇偶校验码、海明校验码和循环冗余校验码(CRC)等。
1、奇偶校验码
奇偶校验码是最简单、最常使用的编解码,能发现代码中一位的出错情况的编码,常用语存储器读写检查。
原理:对于n 位二进制数D=dn-1dn-2…d1d0,添加一位校验位P,P 的位置可以在数据D 的最高位dn-1 之前,也可以在数据D 的最低位d0 之后,并且,P 是数据D 的函数,即P=.(D)。于是,n 位数据D 和1 位校验位P 便构成了一个n+1 位的奇偶校验码。奇偶校验码根据P~D 之间的函数不同,可分为奇校验和偶校验。
偶校验(Even):加入一位校验位PEven 后,使得n+1 位的奇偶校验码中“1”的个数为
偶数,因此,PEven=dn-1⊕dn-2⊕…d1⊕d0。
奇校验(Odd):加入一位校验位POdd 后,使得n+1 位的奇偶校验码中“1”的个数为奇
数,因此,POdd= Even P 。
1)奇偶校验码的纠错能力
根据奇偶校验码的校验可知,奇偶校验码只能发现一位出错或奇数位同时出错,至于出
错的位置是无法确定的,因此,奇偶校验码无法实现纠错功能。尽管如此,由于一位出错的
概率远远高于多位同时出错的概率,奇偶校验码能够满足一般可靠性的要求,因此,奇偶校
验码一种最简单、最常用的数据校验码,它被广泛应用于对存储器中数据的检查或传送数据
的检查。
2)循环冗余校验码(CRC)
CRC校验码发现并纠正信息存储或传送过程中连续出现的多位错误,因此在磁介质存储和计算机之间通信方面得到广泛应用。
生成CRC码:
设n 位数据dn-1…d1d0 所构成一个χ的n-1 次幂的多项式M(χ),即M(χ)= dn-1χn-1+dn-2χn-2+…+d1χ1+d0,约定一个生成多项式G(χ)为χ的k 次幂的多项式,即G(χ)= Ckχk+Ck-1χk-1+…+C1χ1+C0,G(χ)作为除数的余数多项式R(χ)最高次幂为χk-1,因此R(χ)相当于k 位余数形成的多项式。把k 位余数拼接在n 位数据位之后,便构成n+k位的CRC 码。CRC 码的编码只是简单地拼接,关键是如何根据数据去产生k 位余数。由于n 位数据位后附加了k 位余数,n 位数据所构成一个χ的n-1 次幂的多项式M(χ)。
CRC码是用多项式M(x)*xr除以称为G(x)(产生校验的多项式又称为生成多项式)所得余数作为校验位的(模2运算)。为了得到r位余数(校验位),G(x)必须是r+1位。
根据模2 加减运算规则可得:M(χ)·χk-1+R(χ)=Q(χ)×G(χ)
【例】设生成多项式G(χ)=χ3+χ1+1,求4 位数据1101 的CRC 码。
解:∵G(χ)=χ3+χ1+1,是4 位的多项式
∴余数是3 位
根据式(2-16)可得3 位的余数为101,因此,4 位数据1101 的CRC 码为1101101。
CRC码的校验接收端收到CRC 码后,用双方约定的生成多项式G(χ)做模2 除,如果除得的余数为0,则表示接收到的信息中没有错误,否则,则表示接收到的信息中某一位发生错误。出错的位置不同相应的余数也不同,因此,可以根据余数来确定出错的位置,进而实现纠错功能。
2、海明校验码
海明校验码是由Richard Hamming 于1950 年提出的,到目前还被广泛应用。它是在
奇偶校验的基础上,通过合理增加校验位的位数,组成海明校验码,不仅能够实现发现多位出错,而且能够对一位出错进行自动纠正。
1)海明校验码中校验位的位数
步骤一
设数据的位数为n,校验位的位数为k,则组成的海明校验码为n+k 位。校验时k 位校验位的编码共有2k 种状态,其中只有一种状态用来表示数据无误,其余2k -1 种状态用来表示数据有措。由于海明校验码共n+k 位,所以校验位的位数k 与数据的位数n 应满足:2k -1≥n+k
由此公式可由的欲检测的二进制代码位数n求得相应的所需的校验位数k;
步骤二:求被送代码(有效信息)所在的位置
设n+k位代码自左至右依次编码为第1,2,3,….,n+k位;将k位检测位记作Ci (i=1,2,4,8…)分别安插在n+k位代码编号的第1,2,4,8…2k-1;
步骤三:求每个校验位所负责信息位并对其分组
检测位和它所负责的小组中的1的个数为奇数或为偶数,具体分配如下:
C1 检测的g1小组包含1,3,5,7,9,11,…位.
C2 检测的g2小组包含2,3,6,7,10,11,14,15,…位.
C4 检测的g3小组包含4, 5,6,7, 12,13,14,15,…位
C8 检测的g4小组包含8,9,10, 11,12,13,14,15,24…位.
其余检测位的小组所包含的小组所包含的位也可类推。这种小组的划分有如下特点:
1每个小组gi有一位且仅有一位为它所独占,这一位是其他小组所没有的,即gi小组独占第2i-1位(i=1,2,3,…) .
2每两个小组gi和gj共同占有一位是其他小组所没有的,即每两小组gi和gj共同占有2i-1 +2j-1位(i,j=1,2,3,…) .
依次类推,便可确定每组所包含的各位.
步骤四:根据配偶原则来配置海明码
对各组检测位的值等于其所负责的组中的位进行异或运算所得.
海明码的纠错过程:
海明码的纠错过程实际上是对传送后的海明码形成新的检测位pi(i=1,2,4,8,….),根据pi的状态,便可直接指出错误的位置。Pi的状态是由原检测位Ci及所在小组内”1”的个数确定的。
四 bcc异域校验码
实现原理:很多基于串口的通讯都用这种既简单又相当准确的方法。它就是把所有数据都和一个指定的初始值(通常是0)异或一次,最后的结果就是校验值
实现方法:通常把她附在通讯数据的最后一起发送出去。接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。
适用范围:适用于大多数要求不高的数据通讯。
应用例子:ic卡接口通讯、很多单片机系统的串口通讯都使用。
五 MD5
MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,由MD2/MD3/MD4发展而来的。MD5的实际应用是对一段Message(字节串)产生fingerprint(指纹),可以防止被“篡改”。
实现原理:
用特定的算法对数据进行处理得到密文,当用户输入明文,通过用相同算法对明文进行处理,看是否匹配,若匹配则所传输的数据正确,否则错误;
实现方法:
主要有md5和des算法。
适用范围:
数据比较大或要求比较高的场合。如md5用于大量数据、文件校验,des用于保
密数据的校验(数字签名)等等。
应用例子:文件校验、银行系统的交易数据。