1)关于编码的基础知识
在信息的传输过程中,为了达到更高效、更低误码的目的,不可避免地要在发送端进行编码,在接收端进行解码。
通常,编码可以分为信源编码和信道编码,具体的区分可以见下图:
信源编码是用于压缩数据用的;信道编码是用于增加检错、纠错信息,抵抗传输误码的。
例如:奇偶校验、和校验,就是两种最简单的信道编码,在接收端,如果发现校验位/校验字节不对,就可以知道传输中出现了误码,这就是信道编码的作用。
当然,复杂一些的信道编码不只能发现传输错误,还能在一定程度上纠正传输错误。
本文中要讲的,CRC校验码和汉明码,都属于信道编码,它们实现起来简单,效果却非常好。
常见的奇偶校验、和校验只能检出部分误码,能力有限,而CRC校验码可以检出多个bit位的传输错误,有文献表明,CRC16能100%检出:单个位误码、双位误码、奇数个误码、短于16bit的误码,能以99.99%以上的概率检出其他突发性误码。
汉明码与前面几种只能查错的编码不同,它甚至还可以纠正单个bit位的传输错误。
2)CRC校验码
首先来了解一下CRC校验码的原理。
假设我们有一串原始信息bit流要传输,从高位到低位依次为:序列1=11001100;
我们再选择一个用于生成CRC校验码的序列,假设为:序列2=100000111,总长度为k=9;我们暂时称其为“生成多项式”;
然后,我们在原始信息序列1后面增加(k-1)个0,然后将其和生成多项式序列2进行“模二除“(计算时不进位也不借位,二进制除法,相当于按位异或),计算过程如下:
最后得到一个k-1位长度的余数(位数不够的把前面的0也算上),这个余数就是计算得到的CRC校验。
把这个余数替换到原始信息序列1后面,得到新的序列:1100110001101010,这个新的序列就可以“整除”生成多项式序列2。
这样,我们只要在发送端计算出CRC校验,附加到原始信息的末尾一起发送,在接收端看能否整除,就能知道传输过程中有没有误码。
计算过程中的这个“被除数”——生成多项式,可以用多项式形式表示,也可以将序列换算成16进制表示。
计算时取的生成多项式不同,其CRC校验的结果也不同,因此,收发双方应该事先约定好生成多项式。
CRC校验的长度和生成多项式是可以