一、奇偶校验
奇偶校验是一种简单的错误检测方法,它通过确保数据中1的个数为奇数(奇校验)或偶数(偶校验)来工作。
在发送数据时,会添加一个额外的位(校验位),使得整个数据块中1的个数满足奇偶性要求。
接收方在接收到数据后,会检查1的个数是否符合预期的奇偶性,从而判断数据是否在传输过程中发生了错误。
此方法中,校验位通常被添加到数据位的末尾。拼接的规则是:
奇校验:将数据位和校验位一起考虑,使得1的总数为奇数。
偶校验:将数据位和校验位一起考虑,使得1的总数为偶数。
例如,如果原始数据位是 110(二进制),并且使用偶校验,那么需要添加一个校验位使得1的总数为偶数。因为 110 中有2个1,所以需要添加一个0作为校验位,拼接后的数据位为 1100。
二、CRC循环冗余校验码
循环冗余校验(Cyclic Redundancy Check,CRC)是一种基于除法和余数的算法,用于检测数据传输或存储中的意外错误。
CRC通过将数据视为一个大的多项式,然后使用一个固定的除数(通常是一个生成多项式)来除这个多项式,最后得到一个余数。这个余数就是**CRC校验码**,它会附加到原始数据后面一起发送或存储。
例如,如果原始数据是 1011(二进制),生成多项式是 1011,那么通过除法运算得到的余数可能是 011。拼接后的数据位就是 1011011。
接收方收到数据后,会用相同的生成多项式再次进行除法运算,如果余数为零,则说明数据没有错误;如果余数不为零,则说明数据在传输或存储过程中出现了错误。
三、海明校验码
海明校验码是一种可以检测并纠正单个位错误的编码技术,前两者不可纠正。
它基于这样一个原理:如果存在错误,那么错误的位置必定在所有校验位的异或结果中。
海明码通过添加若干个校验位来实现这一目的,这些校验位的位置和值是根据特定的规则计算得出的。它能够确保校验位和数据位的总数满足如下公式 :
其中 r 是校验位的数量,m 是数据位的数量。这个公式确保有足够的校验位来检测并纠正单个错误。
海明校验码的拼接稍微复杂一些,因为它涉及到校验位的计算和位置的确定。校验位的位置通常是2的幂次方(如第1位、第2位、第4位等),而数据位则填充在这些校验位之间。
例如,如果有4个数据位和3个校验位,那么拼接方式是:
数据位 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
校验位 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
比如数据1101 ,信息位被分别安排在 H3, H5, H6, H7的位置,则观察下标可发现:
H3 = H1+H2
H5 = H1+H4
H6 = H2 + H4
H7 = H1 + H2 + H4
通过上面的关系式可以看出,右边在海明码中的数位,正好都是校验码的位置,下面通过校验码在关系式出现的位置,得到校验位的值,以确保能够检测并纠正单个位错误。
P1(H1) = H3 ⊕ H5 ⊕ H7 (⊕表示异或)
P2(H2) = H3 ⊕ H6 ⊕ H7
P3(H4) = H5 ⊕ H6 ⊕ H7
P1 = 1 ⊕ 1 ⊕ 1 = 1
P2 = 1 ⊕ 0 ⊕ 1 = 0
P3 = 1 ⊕ 0 ⊕ 1 = 0
结果为`1010101`。
数据位 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
校验位 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
数据 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |