网上搜了很多关于海明校验码的介绍,看的云里雾里,后面看到一个博客,才弄懂了海明校验码的计算方法,特此分享下。
链接如下:
常用校验码(奇偶校验码、海明校验码、CRC校验码) - FunnyOne - 博客园 (cnblogs.com)
m个数据+k个校验位=m+k个码字
公式:m+k+1<2^k
例:求 1011的海明校验码
m=4, 根据公式 4+k+1<2^k => k=3 即校验位为3位,则新的码字为7位
因为海明校验码是放在2的幂次位上,所以插在位置1,2,4中
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
信息位 | 1 | 0 | 1 | 1 |
位置 | 用到的校验码 |
1 | 校验位 |
2 | 校验位 |
3 | 1+2 |
4 | 校验位 |
5 | 1+4 |
6 | 2+4 |
7 | 1+2+4 |
校验码的位置是1,2,4。位置3= 1 + 2,所以位置3用到的校验码是1和2;位置7= 1 + 2 + 4组成的,所以位置7用到的校验码是1,2和4。
然后将校验码校验的位置记录下来:
校验码1(位置1):3,5,7
校验码2(位置2):3,6,7
校验码3(位置4):5,6,7
注意:后面的数字串是位置的下标,不是值,值还是0或1。
然后做异或运算(相同时为0,不同时为1)
校验码1(位置1):1 xor 0 xor 1 = 0
校验码2(位置2):1 xor 1 xor 1 = 1
校验码3(位置4):0 xor 1 xor 1 = 0
带入表格:
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
信息位 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
接收端接收校验
若此时接收方收到的数据相比源数据,在第6位发生了错误:
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
信息位 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
接收方采用前面类似的方式进行计算校验,区别在于要加上校验位自身这一位,即:
C1= 0(校验码1) xor 1 xor 0 xor 1 = 0
C2= 1(校验码2) xor 1 xor 0 xor 1 = 1
C3= 0(校验码3) xor 0 xor 0 xor 1 = 1
错误位判断:
由于海明校验采取的是偶校验,则上面校验结果全为0说明数据无误(奇校验为1说明数据无误),则C1监督式包含的数据位无错,即3,5,7位数据无错,错误位发生在C2,C3三个监督式包含的位上。
找到C2,C3共同包含的位,为6,7位,而C1表明7位数据无错,则错误位为6位。
也可以用计算公式C3C2C1即110,转换成10进制就是6位。