检错码是一种编码,指在传输过程中发生错误后,在接收端能自动检查并发现错误的编码。常用的检错码有
奇偶校验码、恒比码等。
原理
为提高信息传输的有效性和可靠性,根据香农信息理论,必须对信源消息实施信源编码和信道编码。经过Shannon,Fano或Huff man等3种形式的信源编码后所形成的信息位若不实施信道编码而直接借助信道传输,由于信道干扰的存在必将使得接收端收到的信息出现不可补救的失真,因此必须对这些信息位实施添加某些校验位的信道纠错编码。
两大类别
检错码的两大类别:奇偶校验编码和循环冗余编码。
奇偶校验码是在原信息码元后面附加一个监督元,使码组中1或0的个数为奇数或偶数,为奇数者称为奇数校验码;为偶数者称为偶数校验码。奇数校验码可以发现奇数个错误。恒比码是码组中0和1的比例相同的编码。它能检查并发现偶数个错误。循环校验码(CRC码),是数据通信领域中最常用的一种
差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
奇偶校验编码
奇偶校验是常用的检错方法。其原理是在7单位的ASCII代码后增加一位,使码中“1”的个数成奇数(奇校验)或偶数(偶校验)。经过传输后,如果其中一位(包括奇数个位)出错,则接收端按同样的规则就能发现错误。这种方法简单实用,但只能对付少量的随机性错误。
为了能检测突发性的位串出错,可以使用检查和的方法。这种方法把数据块中的每个字节当做一个二进制整数,在发送过程中按模256相加。数据块发送完后,把得到的和作为校验字节发送出去。接收端在接收过程中进行同样的加法,数据块加完后用自己得到的校验和与接收到的校验和比较,从而发现是否出错。实现时可以用更简单的方法,例如在校验字节发送前,对累加器中的数取2的补码。这样,如果不出错的话,接收端在加完整个数据块以及校验和后累加器中是0.这种方法的好处是,由于进位的关系,一个错误可以影响到更高的位,从而使出错位对校验字节的影响扩大了。可以粗略地认为,随机的突发性错误对校验和的影响也是随机的。出现突然错误而得到正确的校验字节的概率是1/256。 于是我们就有255:1的机会能检查出任何错误。
二维奇偶校验码
二维奇偶校验码是在
奇偶校验码的基础上生成的,又可分为垂直奇偶校验、水平奇偶校验和水平垂直奇偶校验三种。
(1)垂直奇偶校验
垂直奇偶校验又称为纵向奇偶校验,它是把要发送的信息
码元按定长 m 位分为若干段(如分为 n 段),然后按每段的纵向排列,对每列的信息元进行奇偶校验,得到的校验元附在每列后面。传输时按列的次序传输:第 1 列、第 2 列……第 n 列。以传送序列1110111 1101111 1110010 1101100 1100100 为例,图1表明了垂直奇偶校验的基本原理。
由图1可见,垂直奇偶校验的编码效率为 R = m/(m+1),通常 m 取值为 8 ,即一个字符的长度 , 所以垂直奇偶校验有时也称为字符奇偶校验 。这种检验码只能检验出垂直列上的奇数位差错 ,而不能检验出偶数位差错 。 但由于突发错出现奇数位错误码元与出现偶数位错误码元的概率各半 ,因此垂直奇偶校验只能查出 50% 突发性错误 。
(2)水平奇偶校验
水平奇偶校验又称为横向奇偶校验 ,它也是把要发送的信息码元按定长 m 位分为若干段(如分为 n段),然后每段纵向排列 ,对每行的信息元进行奇偶校验 ,得到的校验元附在每行后面 。 传输时同样按列的次序传输 :第 1 列 、第 2 列 … … 第 n +1 列 。 仍以传送序列1110111 1101111 1110010 1101100 1100100 为例 , 图2表明了水平奇偶校验的基本原理 。
由图2可见 , 水平奇偶校验的编码效率为 R = n/(n+ 1)。这种检验的优势是检错能力强 , 不仅能检验出水平方向上每行的奇数位错 , 而且还能检测出突发长度 ≤ m 位的所有突发错 。 但它的缺点是发送端必须等待上层的信息都到全后才能开始计算冗余位 , 接收端也必须等待全部信息都接收后才能开始进行校验 , 所以发送方和接收方都必须设置缓冲区 , 并且产生检验码 、检查检验码的逻辑也比较复杂 。
(3)水平垂直奇偶校验
将水平和垂直两个方向的奇偶校验结合起来就构成了水平垂直奇偶校验 ,又称纵横奇偶检验和方阵奇偶校验 。 仍以传送序列 1110111 1101111 1110010 1101100 1100100 ,图3表明了水平垂直奇偶校验的基本原理。水平垂直奇偶校验的编码效率为 R =mn/[(m+1)(n+1)]。
水平垂直奇偶校验可以检测出所有 3 位或 3位以下的错误 、水平或垂直方向上的奇数个错误 、突发长度 < m 的突发性错误以及部分偶数位错误 。 换言之 ,它可以检测出除了互相补偿的偶数位错以外的所有差错(这里所谓互相补偿的偶数个数是指有错的各行 、各列中出错位数都为偶数的情况) 。另外 , 水平垂直奇偶校验不仅能检错 , 还可以纠正部分差错 。 例如 ,数据码元中仅存在一位错误时 , 就能确定错码的位置(在某行和某列的交叉处),从而纠正它 。
循环冗余编码
工作原理如下:
收发双方依所协议的规定使用一个CRC生成多项式G(x)。常用的多项式有:
CRC-12:G(x)=x12+x11+x3+x2+x+1
CRC-16:G(x)=x16+x15+x2+1
CRC-CCITT:G(x)=x16+x12+x5+1
CRC-32:G(x)=x32+x26+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
计算方法为:最高次方决定
二进制数字序列,凡有x的位置为1,其它位置为0。
根据二进行制数字序列的位数n,在要发送的数据后面补n-1个0;
将得到的新的数据除以二进制数字序列(使用异或算法,不借位),得到一个n-1位数的余数m
将原来要发送的数据序列与余数m构成一个新的数字序列进行发送。
接收方接到发送方发来的数据后,将收到的数据依然用规定的二进制序列来除,如果得到的余数为0,则数据正确,否则重发。