1、奇偶校验码
奇偶校验通过在编码中增加一个校验位来使编码中的1的个数为奇数(奇校验)或者偶数(偶校验),从而使码距变为2.对于奇校验,它可以检测代码中奇数位出错的编码,但不能发现偶数位出错的情况。既当合法编码中奇数位出现错误。也就是1变成0或者0变成1,其编码的奇偶性就发生了变化,从而发现错误。但是这种校验只能发现出现了错误但是不知道具体是哪一位发生了错误。
8421码的奇偶校验码
十进制数 | 8421 BCD码 | 带奇校验位的8421码 | 带偶校验位的8421码 |
0 | 0000 | 0000 1 | 0000 0 |
1 | 0001 | 0001 0 | 0001 1 |
2 | 0010 | 0010 0 | 0010 1 |
3 | 0011 | 0011 0 | 0011 0 |
4 | 0100 | 0100 1 | 0100 1 |
5 | 0101 | 0101 0 | 0101 0 |
6 | 0110 | 0110 1 | 0110 0 |
7 | 0111 | 0111 0 | 0111 1 |
8 | 1000 | 1000 0 | 1000 1 |
9 | 1001 | 1001 1 | 1001 0 |
常用的奇偶校验有三种:水平奇偶校验,垂直奇偶校验校验和水平垂直奇偶校验。
水平奇偶校验:对每一种数据的编码添加校验位,使信息位与校验位处于同一行
垂直奇偶校验:这种校验将数据分为若干组,一组一行,整齐排列,再加上一行校验位,针对每一列采样奇校验或偶校验。
对32位数据:10100101 00110110 11001100 10101011 进行校验:
编码分类 | 垂直奇校验 | 垂直偶校验 |
数据 |
10100101 00110110 11001100 10101011 |
10100101 00110110 11001100 10101011 |
校验位 | 00001011 | 11110100 |
就是这个意思:--------------------------------------------------------------------------------------------------------------
水平校验与垂直水平校验都类似。
2.海明码
海明码也是利用奇偶校验和纠错校验的方法,海明码的构成是:在数据位之间插入k个校验位,通过扩大码距来时间检查和纠错。例如:对于8位的数据,需要4个校验位来进行校验。如,令数据位:D7、D6、D5、D4、D3、D2、D1、D0和校验位位:P4、P3、P2、P1。则编码位置:
H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
D7 D6 D5 D4 P4 D3 D2 D1 P3 D0 P2 P1
校验码的设置位置在2^i的位置上。每个校验位只校验数据中位置号的二进制编码和自身位置号的二进制编码相匹配的数据:
即如下图所示:
因此校验关关系为:
P1偶校验:P1、D0、D1、D3、D4、D6
即:P1=D0⊕D1⊕D3⊕D4⊕D6
P2偶校验:P2、D0、D2、D3、D5、D6
即:P2=D0⊕D2⊕D3⊕D5⊕D6
P3偶校验:P3、D1、D2、D3、D7
即:P3=D1⊕D2⊕D3⊕D7
P4偶校验:P4、D4、D5、D6、D7
即:P4=D4⊕D5⊕D6⊕D7
海明码的错误检测也非常简单,对使用海明码的数据进行如下计算即可:
G1=P1⊕D0⊕D1⊕D3⊕D4⊕D6
G2=P2⊕D0⊕D2⊕D3⊕D5⊕D6
G3=P3⊕D1⊕D2⊕D3⊕D7
G4=P4⊕D4⊕D5⊕D6⊕D7
对于所得的值,若采用偶校验,则全为0表示接受的数据无误(奇校验则全为1)当G4G3G2G1不全为0,说明发生了错误,而且是G4G3G2G1的十进制值指出了错误的位置:如:G4G3G2G1=1010,则说明H10(D5)出了问题,将其取反便可纠正。
设数据01101001,采用四个校验位求其偶校验的海明码:
0 1 1 0 1 0 0 1
D7 D6 D5 D4 D3 D2 D1 D1
P1=D0⊕D1⊕D3⊕D4⊕D6=1⊕0⊕1⊕0⊕1=1
P2=D0⊕D2⊕D3⊕D5⊕D6=1⊕0⊕1⊕1⊕1=0
P3=D1⊕D2⊕D3⊕D7=0⊕0⊕1⊕0=1
P4=D4⊕D5⊕D6⊕D7=0⊕1⊕1⊕0=0
所以校验的海明码为: