校验码
- 背景
- 为什么要校验码
- 校验码
- 校验码的组成
- 奇偶校验码
- 奇校验
- 偶校验
- 海明校验码
- 校验位的个数
- 校验位的下标
- 信息位的异或
- 循环校验码
- 总结
背景
为什么要校验码
校验码是为了解决二进制数据在计算机系统中传输时,发生信息错误的问题。例如发送端,发送数据“1101”, 而接收端收到的数据是“1100”,则数据发送错误。
校验码
校验码的组成
校验码由信息位和校验位构成。这意味着在原始数据“1101”是信息位,而校验码就是在信息位中加入若干(校验位),即bit数据。 编码后,接收端读取到数据中的校验码,来对信息位进行“检测”或者”纠错”。
那么,校验位如何编入信息位中来生成一个校验码?按照不同编码方式,这里一共分成三种校验码:奇偶校验码,海明校验码,循环校验码。 下面分别进行介绍。
奇偶校验码
奇偶检验码,是通过扩大码距(两个码字之间,最小可变码数的距离),用1位二进制数(0或者1)对信息位进行校验。用于奇数个数据位的检错,但不能就错。 它分成两种方式:
奇校验
校验码中1的个数是奇数/判断发送端1的个数和接受端1的个数是否还是奇数,如果不是则发生错误。
例如:信息位:1010;补1位,作为校验位:1; 最终校验码:10101,校验码中1的个数是奇数。
如果接收到11101,此时1的个数是偶数,而奇数校验码要求1的个数为奇数,所以数据产生了错误。
偶校验
偶校验和奇校验相反,判断校验码中1的个数是偶数与否。它的识别度不高,如:
发送端:信息位:1001 加校验位0, 得到校验码:10010
接受端:信息位:1000 校验位1,得到校验码:10001,
故两端的校验码的1依然是偶数。所以不能检测出错误。
海明校验码
海明校验码既可以检错,又可以纠错。
进行海明校验码的步骤如下:
校验位的个数
设信息码个数位m, 校验码个数为r,他们之间满足等式:
2^ r >= m + r+ 1
例如:信息码=01101001, 则 m = 8. 可根据上面的公式,计算出校验位个数r = 4.
校验位的下标
校验码与下标Hi满足这样的关系:
r0 = 2^0 = 下标等于H1
r1 = 2^1 = 下标等于H2
r2 = 2^2 = 下标等于H4
r3= 2^3 = 下标等于H8
由上规律,我们可以先把校验位和信息位的关系填入下标,然后计算各个校验位p1-p4:
信息位的异或
在确认好校验位的下标后。我们开始利用信息码之间的异或,来得出校验位的值。
经过观察,可得出如下规律:
校验码下标:H12 = 2^3 + 2 ^ 2, 也就是说 P4和P3 校验 H12,即信息码D7
校验码下标:H11 = 2^3 + 2 ^ 1+ 2^ 0, 也就是说 P4和P2、P1 校验 H11即信息码D6。
以此类推,我们发现P4 校验位可以用来校验信息码: D8、D7、 D6、 D5
信息码异或则是P4的值,而其他校验位计算如下所示:
P4 = D8 xor D7 xor D6 xor D5 = 0
P3 = D8 xor D4 xor D3 xor D2 = 1
P2 = D7 xor D6 xor D4 xor D3 oxr D2 oxr D1 = 0
P1 = D7 xor D5 xor D4 xor D2 oxr D1 = 1
所以最终01101001的海明校验码为0110 0 100 1 1 01
错误检测
对使用海明编码对数据进行差错✊:
G1 = 新的P1 xor 原始P1
G2 = 新的P2 xor 原始P2
G3 = 新的P3 xor 原始P3
G4 = 新的P4 xor 原始P4
如果G1G2G3G4都是0,则数据正确,反之数据错误。如果G = 1010,则对应十进制H10(D5)发生错误,对其取反则可纠错。
循环校验码
循环校验码又称CRC校验码。 它只能用于机器码的检查错误,而不能纠错。
循环校验码也是又信息位和校验码组成。其中信息位通过模2取余法,把余数作为校验位拼接到信息位末尾,即可得到循环校验码。
如果接收端得到的码字,进行模2运算,余数不为0,则代表发生数据错误。
总结
本文介绍了数据的校验码的类别和编码方式,详细介绍了较难的海明校验码的编码原理。如有错误,欢迎指正,谢谢。