一、BCD码
二进制按权展开相加转化为十进制或者十进制乘基取整除基取余转化为二进制
仍然比较麻烦,我们需要更快的转化方式,所以有了BCD码二进制与十进制
一一对应来转化。但是由于四位二进制数可以组合出十六种代码,而十进制
为0~9,所以必有6种状态为冗余状态。
常用BCD码:
1.8421码。
是一种有权码。权值从高到低依次为8、4、2、1.是一种十进制数的编码
如:7——>0111;
因为有六种冗余状态,所以当两个8421码之和大于9时,便需要加0110,
也就是+6修正,并向高位进位。
如:9+4=13:
1001
+0100
----------
1101 由于1101大于9,所以需要加0110修正
+0110
----------
10011
2.余三码。
无权码。在8421码的基础上加上0011形成,因每个数都多余3.所以叫余三码。
3.2421码。
有权码,就是8421的最高位权值换为2,由高到低依次为2、4、2、1.
注意:大于等于5的4位二进制数的最高位为1而不能为0,小于5的最高位为0.
二、校验码
校验码是指能够发现或能够自动纠错的数据编码。
原理:通过增加一些冗余码,来检验或纠错编码。
注意:码距不小于2的数据校验码才开始具有检错的能力。
检错能力、纠错能力与码距成正比,而且检错能力≥纠错能力。
1.奇偶校验码
在原编码上加一个校验位,它的码距=2,可以检测出一位错误(或奇数位错误)
但不能确定出错的位置,也不能检测出偶数位错误,增加的冗余位称为奇偶校验位
一、奇校验码:整个校验码中“1”的个数为奇数。
如:1001101——>1 1001101
(前面的1便为校验位,校验位放在其他位置后,原理也是一样的)
二、偶校验码:整个校验码中“1”的个数为偶数。
如:1001101——>0 1001101
缺点:具有局限性,只能发现奇数位出错情况,且不能纠正错误。
常用于对存储器数据的检查或传输数据的检查。
2.海明(汉明)码
海明码实际上是一种多重奇偶校验码。
实现原理是在有效信息位中加入几个校验位形成海明码,并把海明码的每个二进制
位分配到几个奇偶校验码中。当某一位出错后,就会引起有关的几个校验位的值发
生变化。
海明码能发现两位错误并纠正 1 位错误。
例:求1010的海明码
解:
(1)确定海明码的位数,即k的大小
设n为有效信息的位数(n=4),k为校验位的位数,则信息位n和校验位k应满足
2^k≥n+k+1
(若要检测两位错,则需增加1位校验位,即算出k后,需要再加1:k+1)
海明码位数为n+k+1=8≤2^3成立。设信息位为D₄D₃D₂D₁(1010),校验位为
P₃P₂P₁,共三位,对应汉明码为:H₇H₆H₅H₄H₃H₂H₁
(2)确定校验位的分布
规定校验位Pi在海明位号为2^(i-1)的位置上,其余位为信息位。
P₁海明位号为:2^(1-1)=1,即H₁为P₁
P₂海明位号为:2^(2-1)=2,即H₂为P₂
P₃海明位号为:2^(3-1)=4,即H₄为P₃
将信息位按原来的顺序插入,海明码各位分布如下:
H₇ H₆ H₅ H₄ H₃ H₂ H₁
D₄ D₃ D₂ P₃ D₁ P₂ P₁
(3)求校验位的值
每个数据位用多个校验位进行校验:被校验数据位的海明位号等于校验该
数据位的各校验位海明位号之和。另外校验位不需要再被校验。
D₁在H₃中:3化为二进制:0 1 1
D₂在H₅中:5化为二进制:1 0 1
D₃在H₆中:6化为二进制:1 1 0
D₄在H₇中:7化为二进制:1 1 1
然后从右往左对每一列为1的D进行异或运算,
最右边这一列即为P₁=H₃⊕H₅⊕H₇=D₁⊕D₂⊕D₄=0⊕1⊕1=0
P₂=H₃⊕H₆⊕H₇=D₁⊕D₃⊕D₄=0⊕0⊕1=1
P₃=H₅⊕H₆⊕H₇=D₂⊕D₃⊕D₄=1⊕0⊕1=0
所以,1010对应的海明码为:
H₇ H₆ H₅ H₄ H₃ H₂ H₁
1---0---1---0---0---1---0
(4)纠错
接收到:1010010
S₁=P₁⊕D₁⊕D₂⊕D₄=0⊕0⊕1⊕1=0
S₂=P₂⊕D₁⊕D₃⊕D₄=1⊕0⊕0⊕1=0
S₃=P₃⊕D₂⊕D₃⊕D₄=0⊕1⊕0⊕1=0
(即:利用接受到的数据再计算一次P,然后与接收到的P异或运算,看是否相等)
若S₃S₂S₁的值为”000“,则说明无错,反之则出错,且这个数就是错误位的位号,
如S₃S₂S₁=001,说明第1位出错,即H₁出错,直接将该位取反就达到了纠错的
目的。
3.CRC码
CRC基本思想:在K位信息码之后再拼接R位的校验码。整个编码的长度位N位,
因此又称(N,K)码。
CRC码可以纠正一位或多位错误(由多项式G(x)决定),实际传输方法可以按需求
选择,如:请求重发、删除数据、通过下面介绍的余数自行纠正。
例:设生成多项式为G(x)=x³+x²+1,信息码为101001,求对应的CRC码。
(生成多项式是接收端和发送端的一个约定)
解:
(1)确定K、R以及生成多项式对应的二进制代码。
K:信息位,R:校验位。
R=生成多项式最高次幂=3,K=信息码的长度=6,N=K+R=9
生成多项式对应二进制代码:1×x³+1×x²+0×x¹+1×x⁰=1101
(2)移位
把信息码左移R位,低位补0。101001**000**
(3)相除
对移位后的信息码,用生成多项式进行模二除法,得到余数
模二除法:模二加法和减法的结果相同,都做异或运算。模二除法不借位。
所以报文101001的CRC码为101001**001**.
(4)纠错
接收端接收到的CRC码,用生成多项式二进制代码做模二除法,若余数为0,则
码字无错。如若接收到为:C₉C₈C₇C₆C₅C₄C₃C₂C₁=101001011,将这个数据与
1101进行模二除法,得到余数为010,则说明C₂出错,将C₂取反即可。
但是也可以看出C₉是无法表示的,因为校验码只有三位,所以CRC也并不完美。