[TOC]
最简单实用的一种校验数据的方式。在原始数据的后面加一个校验位来实现数据的校对。
若原始数据为:\(D=(D_1,D_2...D_n)?\)
偶校验:$D_偶 = D_1 \bigoplus D_2 \bigoplus...D_n $
奇校验:\(D_奇 = \overline{ D_1 \bigoplus D_2 \bigoplus...D_n }\)
验算时:
\(F = \overline{D_1 \bigoplus D_2 \bigoplus...D_n \bigoplus D_奇}\)
\(F = D_1 \bigoplus D_2 \bigoplus...D_n \bigoplus D_ż\)
如果 \(F\) 的值为 0 ,则传输正确,否则错误
奇偶校验码只能检查一位错,并且无法纠错
若一共有 k 个数据位,则需要 r个检验位来完成一位纠错,两位检错。
$ 2^{r-1} \geq k + r$
新生成的数据为 k+r位,其中每个校验位放在2的幂次方的位置上
其值为原始数据位在新的排列后,其位次的二进制中有对应位的数的异或和
最后一个校验位的值是前面所有位的异或和,其作用是判断是一位错还是两位错
当接收方接收数据后。先看最后一位,若是1则代表一位错。具体位置由各个位置的海明码组成的二进制表示。
若是0,则若是其他位校验码都是0表示传输正确,否则就是两位错。
前置技能:模2除法
传输前双方约定好一个二进制串,设长度为r,要求最高位和最低位的值必须为1
先将原始数据右移r-1位,低位补0。
然后将这个数除之前的二进制串,得到的余数和之前处理好的数据相加。得到校验码。
PS.这个余数一定是要r-1位的,若不够则高位补0
原文:https://www.cnblogs.com/SCaryon/p/9240702.html