计算机系统运行时,为了确保数据在传送过程中正确无误,一是提高硬件电路的可靠性,二是提高代码的校验能力。通常使用校验码的方法来检测传送的数据是否出错。
校验码的基本思想是通过引入冗余信息并使用校验算法来检测和纠正数据的错误,从而提高数据的完整性和可靠性。具体如下。
e . g . e.g. e.g. 一个简单的例子
假设要传输的数据是 01010011,这是一个8位的二进制数。
奇校验: 在奇校验中,需要确保总共包含奇数个1。首先,计算数据中的1的数量,这里有4个1。为了保证总共有奇数个1,需要在数据末尾添加一个1,使其变成 010100111。这个额外的末尾的 1 就是奇校验位。
偶校验: 在偶校验中,需要确保总共包含偶数个1。计算数据中的1的数量,这里有4个1,为了保证总共有偶数个1,需要在数据末尾添加一个0,使其变成 010100110。这个额外的末尾的 0 就是偶校验位。
海明码在数据位之间的特定位置上插入 k k k 个校验位,通过校验位与数据位结合的异或方法来检错和纠错。
设数据位是
n
n
n 位,校验位是
k
k
k 位,则
n
n
n 和
k
k
k 必须满足以下关系:
2
k
−
1
≥
n
+
k
2^k-1 ≥ n+k
2k−1≥n+k
假设对于 8 位的数据位,进行海明校验需要 4 个校验位: 2 3 − 1 < 8 + 3 , 2 4 − 1 ≥ 8 + 4 2^3-1 < 8+3,2^4-1 ≥ 8+4 23−1<8+3,24−1≥8+4
海明码校验位的位置,又称为海明码的编码规则。
设:
那么:


校验的检测方案如下:
e . g . e.g. e.g. 若采取偶校验, G 4 G 3 G 2 G 1 = 1010 G_4G_3G_2G_1=1010 G4G3G2G1=1010,说明 H 10 ( D 5 ) H_{10}(D_5) H10(D5)出错,将其取反即可纠正错误。
循环冗余校验码(CRC, Cyclic Redundancy Check)是一种用于检查数据传输或存储时是否出现错误的算法。
其基本原理是对待发送的原始数据添加一些冗余的数据,使得整个数据的CRC值为0,接收方在接收到数据后重新计算CRC,如果值不为0,则说明数据在传输过程中有错误。
e . g . e.g. e.g. 一个简单的例子如下,其中CRC使用的多项式是CRC-4: x 4 + x + 1 x^4 + x + 1 x4+x+1
原始数据: 1101
添加0: 11010000
生成多项式: 10011(因为
x
4
+
x
+
1
x^4 + x + 1
x4+x+1 转换为二进制为 10011)
开始模2除法:
11010000
10011 <-- 第一次异或
---------
01001000 <-- 结果,移动到下一位,重复异或操作
10011
---------
00000100
10011
---------
00100010
10011
---------
00110001
从上面的结果,我们可以看到余数为 `0001`,所以CRC值为`0001`。
如此,我们得到的CRC值是 0001,因此,发送的数据应该是 11010001 。接收端收到这个数据后,可以用相同的方法再次计算CRC,如果计算出的CRC为 0000,则说明数据没有错误。
此上,为三个校验码,即 奇偶校验码、海明码与循环冗余校验码。