1,奇偶校验码
是通过增加冗余位使得码字中“1”的个数恒为奇数或者偶数的编码方式,是一种检错码。无法纠正错误。
原编码 奇校验 偶校验
0000 0000 1 0000 0
0010 0010 0 0010 1
1100 1100 1 1100 0
2、海明码
为k个数据位设置r个校验位,则r个校验位能表示2的r次方个状态,用1个状态指出“没有错误发生”,用剩余的2的r次方减一个状态指出有错误发生在某一位,因此校验位的位数r与数据位k应满足以下关系:
2的r次方 ≥ k+r+1
海明码可以实现纠错,能指出哪一位出错,能对出错位求反得到该位的正确值。
例子:求011的海明码
第一步,确定校验位的位数
k=3,那么r=3
第二部,确定校验位的位置,位置在2^i处(i=0,1,2,…)即在第1,2,4,8,16…处
海明码 | h6 | h5 | h4 | h3 | h2 | h1 |
校验位 | r3 | r2 | r1 | |||
数据位 | d3 1 | d2 1 | d1 0 |
r1=d1⊕d2 (异或:不同为1,相同为0)1
r2=d1⊕d3 1
r3=d2⊕d3 0
第四步,检验
s3=r3 xor d2 xor d3
s2=r2 xor d1 xor d3
s1=r1 xor d1 xor d2
若s3,s2,s1为001,则第1位出错;若为100,则第4位出错。
说明:
对于:
(P1,P2,B3,P4,B5,B6,B7,P8,B9,B10)
确定校验位的值要首先确定采用奇校验还是偶校验。以偶校验为例
P1=B3⊕B5⊕B7⊕B9…
P2=B3⊕B6⊕B7⊕B10⊕B11…
P4=B5⊕B6⊕B7⊕B11⊕B12⊕B13⊕B14…
P8=B9⊕B10⊕B11⊕B12⊕B13⊕B14⊕B15…
①校验位为什么是几个数据抑或(⊕)的和?
我们说了我们采用的校验方法是偶校验,拿P1来说,它要使得P1,B3,B5,B7…这个数列中1的个数为偶数个。那么可以用上面的公式来求得P1的值为0。原因是比如上例数据100101,其中B3、B5、B7、B9为1、0、1、0,则1的个数为2个为偶数个,那么P1只要为0就可以满足P1,B3,B5,B7…中1的个数为偶数个了。其他的P2、P3、P4同理。
②为什么P1是这几个数的和,而P2又是另外几个数的和,他们是怎么组合的呢?
这是个很妙的事情,对于Pi,从Pi开始连续i位然后隔i位再连续i位直至最后相抑或(⊕)得到Pi。比如P4=B5⊕B6⊕B7⊕B12⊕B13⊕B14⊕B15…。等号后边是从P4开始(包括P4)连续4位再跳过4位(B8,B9,B10,B11)再连续4位B12,B13,B14,B15…这些位相抑或(⊕)得到P4。其他的校验码同理。
(部分内容引用https://www.cnblogs.com/rainvector/p/3509522.html)