计算机底层:奇偶校验码
校验码的作用:
在数据传输或存储时,可能会因为计算机元器件或收到外界干扰,导致数据发送变换。比如:在数据传输时,由于磁场干扰,使数据发送了改变,本来要传输:001,可是传输过去的结果变成了110。
为了在数据传输或存储时,能够及时发现错误数据,因此就需要对数据进行校验。更有胜者
还能够对数据进行复原。
奇偶校验码能够发现错误数据。
奇偶校验码:
![](https://img-blog.csdnimg.cn/img_convert/3bb5fdfae7773f49c08bae3288d97e59.png)
如上图:两台电脑知道且使用一种编码方式,数据是2bit,因此数据只有四种表示方法。
![](https://img-blog.csdnimg.cn/img_convert/868277896a9cd09e30eddbb2600171ed.png)
在两台电脑之间传输数据时,出现了位错误:0变1,1变0。原本左边发送的是01的编码,可是传输时右边收到的却是00。
用户本来想表达B可是别人收到的却是A。
此时因为(00)A和(01)B都是合法字符,因此两人在传输数据时,并不会发现这个错误。
校验码原理:
为了发现错误,就出现了校验码进行对数据的校验。
![](https://img-blog.csdnimg.cn/img_convert/26ec9ef1a72d6749ca2db4929a4bc4d0.png)
2个bit表示4个信息,那么无论数据如何变,另一方收到的数据都是合法状态的。奇偶校验码就是设置数据的非法状态,来发现错误信息。
奇偶校验码在前面加了1bit。变成了2^3=8种状态。由于这里只有4个数据。因此只需要使用4种状态就行。多出来的4中状态是冗余的。
因此只要将数据对应的四种状态设为合法状态,冗余的四种状态设为非法状态,那么计算机校验时,如果发现数据是非法状态的数据,那么计算机就会知道,这个数据在传输过程中发生了改变。
![](https://img-blog.csdnimg.cn/img_convert/1ec30d5d9d757e2cfd9d97ded26d1272.png)
此时左边创数001的数据,位错误发生后,右边收到了000,右边电脑发现000是非法状态。因此右边计算机就发现了这一数据的错误。
校验码须知的概念:
![](https://img-blog.csdnimg.cn/img_convert/0a419d935c3042bee1b2ac2bd9a05e71.png)
码字:就是编码,00,01,100,001。右边有4个冗余的码字
两个码字间的距离:00和11之间的距离就是2。因为两个码字的2个位是不同的。再比如100和111之间的就离也是2。
码距:如图左边的编码方案,编码之间的最小距离是1,则码距就是1;如图右边的编码方案,编码之间的最小距离是2,则码距就是2。
发现:
![](https://img-blog.csdnimg.cn/img_convert/b60ecba480b512097d8de9cd9105b630.png)
奇偶校验码的原理:
![](https://img-blog.csdnimg.cn/img_convert/106c269c1aa703e511766fb3bf803145.png)
奇偶校验码就是在n个bit的最前面加上一个bit。如果在整个校验码(n+1bit)中,1的个数位奇数个,那么此校验码为奇校验码;如果1的个数为偶数个,那么此校验码为偶校验码。
![](https://img-blog.csdnimg.cn/img_convert/e440ecce94c1785b77cf31a353ae5da8.png)
奇偶校验码的使用:
如果两方使用偶校验码,如上图传输1010111时,使用了偶校验码,在最前方加入了1,校验码变成了:11010111。
两方传输时,发生了改变。11010111变成了11010110。接收方发现。11010110中的1有奇数个(5),并不符合偶校验码的规定。那么就是知道这串数据在传输时发送了改变。认为这是不合法的。
奇偶校验码的局限性:
上述奇偶校验码的使用中,偶校验码只改变了1个bit。
如果改变两个bit:从11010111变成了11010100,接收方发现1有偶数个(4),符合了偶校验码的规定。接收方就会认为这个数据在传输时并没有发生改变。认为这是合法的。
因此就会发现奇偶校验码的一个问题:
如果在使用偶校验码在数据传输时,如果数据传输时改变了奇数个,那么接收方会发现这个信息发生了改变,如果数据传输时改变了偶数个,那么接收方就会认为这个数据是合法的。
反之奇数校验码也是存在这个问题:
如果在使用奇校验码在数据传输时,如果数据传输时改变了偶数个,那么接收方会发现这个信息发生了改变,如果数据传输时改变了奇数个,那么接收方就会认为这个数据是合法的。
因此,奇偶校验码就存在了这样的局限性。
底层硬件中奇偶校验码的工作原理:
对数据进行进行添加校验位(下图举例偶校验位),即,给最前面加上1bit的工作方式:
相同的数据异或是0。
![](https://img-blog.csdnimg.cn/img_convert/1f6942a4362000c5f5b8b410c7b767e1.png)
发起方,进行添加奇偶校验码。
求偶校验码:
理解小技巧:学过c的也知道,数据异或时是满足分配律的。只需要看1的个数,如果是奇数个,无论有多少0得到的结果都是1。如果是偶数个,无论有多少0得到的结果都是0。
异或后如果是0说明1有偶数个,那么为了保证整个校验码有偶数个1,则在校验位添上0;如果是1说明1有奇数个,那么为了保证整个校验码有偶数个1,则在校验位添上1
求奇校验位:
与偶校验位相反,异或后如果是0说明1有偶数个,那么为了保证整个校验码有奇数个1,则在校验位添上1;如果是1说明1有奇数个,那么为了保证整个校验码有奇数个1,则在校验位添上0
上面是对求出给最前面加上1bit的校验位,以下是对校验码进行校验:
![](https://img-blog.csdnimg.cn/img_convert/50c60c0d5d33de7da9c6515e9321eb28.png)
接收方进行奇偶校验。
偶校验:
异或结果是0说明1的个数是偶数个,那么对于偶校验码是合法的,数据没有发生改变。
异或结果是1说明1的个数是偶数个,那么对于偶校验码是不合法的,数据发生了改变。
需要注意奇偶校验的局限性:如果这里改变了偶数个,那么还是会认为数据没有改变。
奇校验:
异或结果是0说明1的个数是偶数个,那么对于奇校验码是不合法的,数据发生了改变。
异或结果是1说明1的个数是奇数个,那么对于偶校验码是合法的,数据没有发生改变。
需要注意奇偶校验的局限性:如果这里改变了奇数个,那么还是会认为数据没有改变。
总结:
![](https://img-blog.csdnimg.cn/img_convert/aea62b53a0b94c3964309dba4371e65c.png)