本篇目录
前言
一、校验码
1.校验码
2.码距
3.检错与纠错
二、奇偶校验码
三、海明码
1.海明校验码的原理
2.校验位的计算方法
四、CRC码(循环冗余校验)
总结
跟着王道的考研复习指导,学习了三种校验码,做一个小结。
信息传输过程可能出现一些错误,于是发送端与接收端就会约定一种规则,发送端根据这种规则以及要发送的有效信息,来计算得出几位校验码。发送端在发送时,通过在有效信息位外再附加这些校验码,使接收端能够通过这些校验码得知接收的数据是否有误,甚至能判断错误的数据位置。这就是校验码的作用。
一种信息编码,它的编码方式决定了任意两个码字之间的最小距离,即码距。如果一种编码,它的合法码字之间的距离是1,这意味着假如有一个合法码字在传输过程中有一位出错了,它会变成另外一个合法码字。由于变化的结果仍然是合法的码字,接收端就无法判断接收的码字是否是正确的。比如发送端与接收端约定使用三位来表示数字0-7,这样的编码的码距就是1,即便传输过程中有一位出错,接收端也无法得知传输有错,因为接收到的仍然是合法的码字。但是假如发送端与接收端约定,使用001、010、100来表示数字1 、2、4,(这种编码的码距为3)那么接收端如果收到了011这样的结果,就知道这是一个不合法的码字,接收端就能知道其中一定出错了。
要计算两个合法码字之间的码距,就将这两个合法码字进行异或运算,看得到的结果中有几个1,码距就是几。或者也可以理解为比较这两个合法码字,看有几位翻转了,码距就是几。
如果一种编码的码距为1,那么就无法进行校验。因此想要有校验能力,一种编码的码距至少要是2。码距越大,检错、纠错(指出出错的位置)能力越强。L-1=D+C,且D≥C,L即最小码距,D即检错能力,C即纠错能力。
奇偶校验码是在有效信息位前边加上一位校验码,码距为2,可以检测一位错误(或奇数位错误),不能确定出错的位置。
奇校验码:整个校验码(校验位和有效信息位)中“1”的个数为奇数;
偶校验码:整个校验码(校验位和有效信息位)中“1”的个数为偶数;
收发端约定采用的是奇校验还是偶校验,然后接收端对接收的数据进行校验。比如,1011是奇校验码,0011是偶校验码。
海明码的实质还是奇偶校验码,只不过它利用多重奇偶校验,就不仅可以检错,还能指出一位错误的位置。因为海明码能纠错1位,那么至少就能检错1位,因此码距至少为3 。
如果给整个校验码设置角标,从1开始,从最后侧开始,那么海明码的校验位设置在角标为2^n (n从0开始,到哪儿结束这取决于有效信息的长度)的位置上,其它位置就是有效信息位。也就是说,校验位是穿插在有效信息位中的。每个有效信息位的角标,总是可以表示成某些校验位的角标之和,比如角标6就可以表示成(2+4),角标7可以表示成(1+2+4),这是使用海明校验码的基础。由此可以知道,有效信息位数n 与校验位的位数k 存在这样的关系:整个校验码的长度(n+k) ≤ 2^k-1 即k个校验位能表示的最大角标。
1.根据上述公式,依据有效信息的长度,确定校验位的个数。比如4位有效信息需要3位校验位。
2.用符号表示出整个校验码。
角标 7 6 5 4 3 2 1
值 D4 D3 D2 P3 D1 P2 P1
校验位 - - -
3.列表法表示出每个有效信息位的角标由哪几位校验位的角标组成
P1(角标1) | P2(角标2) | P3(角标4) | ||
H1 | 角标3 | 1 | 2 | |
H2 | 角标5 | 1 | 4 | |
H3 | 角标6 | 2 | 4 | |
H4 | 角标7 | 1 | 2 | 4 |
4.计算每一个校验位的值,计算方法就是将表中对应的有效信息位的值进行异或。比如上表中P1校验位的值 = H1⊕H2⊕H4。 这样校验码就完成了。例如,1010对应的海明码为1010010 。
5.接收端根据收到的有效信息位,以同样的方法计算出每一个校验位,如果与收到的校验位一致,那么收到的信息正确。若不一致,则可以根据不一致的校验位来确定是哪一位出错了。
CRC码利用的是除法。
任何一个二进制编码可以用一个系数仅为1或0的多项式来表示,多项式的最高次用R表示,那么这个二进制编码就有R+1位。收发端约定一个多项式作为规则。如果让这个二进制编码作为除数,然后用有效信息作为被除数,去做除法,那么余数一定可以用R位二进制表示(最多有R位)。由此,就让有效信息位先左移R位,即在有效信息位的右边先填补R个零(作为校验位) 。然后以左移之后的有效信息作为被除数,与多项式对应的二进制编码作为除数,进行除法运算,最终能够得到一个R位的余数。这个余数就是校验位。这样,整个校验码就应该能够被除数所整除了。发出端就将这个校验码发出。
接收端只要检查一下,校验码是否能够被约定的多项式所对应的二进制编码(也就是除数)所整除,就可以了。如果能,那接收的信息正确。如果不能,那么可以根据余数来判断发生错误的位置。
做除法运算时,从被除数的最左边的R位开始,每一次异或运算后,就向后取一位,每次都是R位参与运算。运算时,若被除数最高位为1,则商为1;若被除数最高位为0,则商为0 。直到被除数的位数用完,算出R位余数。
本文总结了三种常见的校验码(奇偶校验码、海明码、循环冗余校验(CRC)码)。