码距
两个码组对应位上数字的不同位的个数称为码组的距离,简称码距,又称海明(Hamming)距离。
计算码距的一种方法,就是对两个位串进行异或(xor)运算,并计算出异或运算结果中1的个数。
例如110和011这两个位串,对它们进行异或运算,其结果是:
110⊕011=101;
异或结果中含有两个1,因此110和011之间的码距就等于2。
简单来说,就是,两对应相同位数的不同即码距+1,从首位开始对应;
例如00110和00100码距为1,12345和13344码距为2,Caus和Daun码距为2,1011001和10110110码距d=2
————————————————
版权声明:本文为CSDN博主「ghc_kailei」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:link
1 奇偶校验码
2 海明码
例如:
用偶校验方式的海明码校验数据01101001
1. 第一步:确定校验码的位数k
- 首先
题目中的原数据01101001的位数n=8,这8位数分别用Di表示。(注意顺序是反着的,也就是依次为D7,D6,D5,D4,D3,D2,D1,D0) - 校验码位数 k 与原数据 n 的关系为:2k - 1 ≥ n + k
- 可以将k=1,2,3,4,5等代入很快就求得k=4是最小的满足者,第一步完成。
2. 第二步:确定校验码以及原数据的位置
-
综上所述
海明码共8+4=12位,分别用Hi表示;
校验码4位分别有Pi表示;
原数据8位有D(0-7)表示。 -
小知识
校验码总是放在海明码下标为2i的位置,如:1,2,4,8…
先安排校验码的位置
H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|---|---|---|---|
- | - | - | - | 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 |
0 | 1 | 1 | 0 | P4 | 1 | 0 | 0 | P3 | 1 | P2 | P1 |
3. 第三步:求校验码
我们要知道需要校验的是题目中给出的原数据,也就是D(0-7)
在海明码中,结合上面的表格,看看我的思路(以下例子看几个就好,后面有结论表格),下面的加法纯属看下标,没有实际的值
D0—对应H3—H3=H2+H1—H2,H1对应P2,P1—所以D0由P1,P2验证。
D1—对应H5—H5=H4+H1—H4,H1对应P3,P1—所以D1由P1,P3验证。
D2—对应H6—H6=H4+H2—H4,H2对应P3,P2—所以D2由P2,P3验证。
D3—对应H7—H7=H4+H2+H1—H4,H2,H1对应P3,P2,P1—所以D1由P1,P2,P3验证。
D4—对应H9—H9=H8+H1—H8,H1对应P4,P1—所以D4由P1,P4验证。
D5—对应H10—H10=H8+H2—H8,H2对应P4,P2—所以D5由P2,P4验证。
D6—对应H11—H11=H8+H2+H1—H8,H2,H1对应P4,P2,P1—所以D6由P1,P2,P4验证。
D7—对应H12—H12=H8+H4—H8,H4对应P4,P3—所以D7由P3,P4验证。
由以上得出
需验证的数据 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
由哪个校验码验证 | P3 ,P4 | P1 ,P2 ,P4 | P2 ,P4 | P1 ,P4 | P1 ,P2 ,P3 | P2 ,P3 | P1 ,P3 | P1 ,P2 |
- 知识点来了,求校验码的值
- 验证码 = 需要它验证的所有原数据(题目中给出的)相异或,也就是说
P1=D0异或D1异或D3异或D4异或D6(10101)
P2=D0异或D2异或D3异或D5异或D6(10111)
P3=D1异或D2异或D3异或D7(0010)
P4=D4异或D5异或D6异或D7(0110)
- 知识点来了
- 若采用奇校验,则将各校验位的偶校验值取反即可
4. 最后一步:校验
四个校验位由Gi表示
Gi=Pi和所有由它校验的原数据相异或,即,
G1=P1异或D0异或D1异或D3异或D4异或D6(P1,10101)
G2=P2异或D0异或D2异或D3异或D5异或D6(P2,10111)
G3=P3异或D1异或D2异或D3异或D7(P3,0010)
G4=P4异或D4异或D5异或D6异或D7(P4,0110)
结论
- 若采用的是偶校验,四个校验位Gi全为0,表示收到的数据正确
- 若采用的是奇校验,四个校验位Gi全为1,表示收到的数据正确
3 循环冗余校验码
模2除法
①不向上借位,只要除数和被除数的位数相同就可进行计算,不比较它们的大小;不进位;不退位
②模2运算中用到了模2减法,与逻辑异或相似:
1-1=0, 1-0=1, 0-1=1 , 0-0=0,
③例子:
CRC校验的步骤
(1)选择一个生成多项式,作为对接收的帧进行除法运算时的除数,生成多项式可以写为二进制形式;
-
生成多项式的要求:
①最高位和最低位必须为1;
②当CRC码的任何一位发生错误时,新帧除生成多项式后余数不为0;
③不同位发生错误时,余数应该是不同的; -
生成多项式转化为二进制形式:
如x5+x3+x2+1,(1 * x5 + 0 * x4 + 1 * x3 + 1 * x2 + 0 * x1 +1)写为二进制:101101
(2)计算CRC校验码位数k=生成多项式位数-1,在要发送的数据帧后加k个0,除第一步用生成多项式转化的二进制数(使用模2除法),得到的余数即为CRC校验码;
模2除时,余数的位数必须只比除数少一位,不能省略0
(3)把得到的校验码CRC加到原数据帧后,构成一个新数据帧发送到接收端,接收端将新帧除以之前选择的除数(模2除法),如果没有余数,则表明该数据帧在传输过程中没有出错,否则出错;
CRC校验例子:
假设CRC生成多项式G(X)=X5+X4+X+1,要发送的二进制数据帧为100101110,求CRC校验码:
①把生成多项式转换为二进制数:110011;(二进制数的 位数 = 多项式的最高次幂 + 1)
②由生成多项式的位数为6可知,CRC校验码的位数为5,所以在数据帧后加5个0,变为10010111000000,将这个数使用模2除法除以生成多项式110011,得到余数即CRC校验码11010;
③用得到的CRC校验码替换掉数据帧中的5个0,形成新的帧10010111011010,将这个新帧发送给接收端;
④接收端收到新帧后,用新帧除以上面的多项式110011(模2除法),如果余数为0,该数据帧在传输过程中没有出错,否则出错;(经验证余数为0)