什么是数据校验码
计算机系统中的数据在读写、存储和传送的过程中可能会产生错误,这个时候就需要带有发现某些错误和自动改错能力的数据编码方法。实现原理就是加进一些冗余码,使合法数据编码出现某些错误时,就成为非法编码,这样就可以通过检测编码的合法性来达到发现错误的目的。
先来了解几个概念:
- 码距:任意两个合法码之间最少有几个二进制不同,仅有一位不同,其码距为1;
例如有如下合法码:
000 、 001 、010 、100 …
合法码之间最少有1位不同,码距为1;
0110 、 1010、0011、0101 …
合法码之间最少有2位不同,所以码距为2;
合理地增大码距,能提高发现错误的能力;但码所使用的二进制位数变多,增加了数据存储的容量或数据传送数量,所以通常要考虑在不多增加硬件的情况,尽可能发现或改正更多的错误。
常用的数据校验码有 奇偶校验码、海明校验码 和 循环冗余校验码:
01 奇偶校验码
奇偶校验码:为一个数据字节补充一个二进制位,称为校验位,使字节的8位和该校验位含有1值的个数为奇数或偶数。
异或运算:相同为0,相异为1;
如果有偶数个二进制位出错,偶校验的结果还是偶数,无法检测出错误;
奇偶校验实现电路:
02 海明校验码
实现原理:在数据中加入几个校验位,并把数据的每一个二进制位分配在几个奇偶校验组中。
海明校验码是在偶校验的基础上实现的:
- 海明码不仅可以校验错误,还可以纠错
海明码由 n 位信息位 和 k 位校验位构成,其中:
- k位校验位能够表达 2的k方 种状态
- (要能够涵盖一位数据没有出错的正确位,有可能出错的n位信息位、k位校验位 );
- 即要满足 2的k次方 >= n + k + 1
- 校验位P的位置: 1、2、4、8、16…(和二进制的权值一样)
- 确定需要多少位海明码;
- 确定校验位的分布(把信息位的位置二进制列出来寻找);
- 求校验位的值(偶检验)
- 纠错 得到出错位
以上是从右往左的顺序,接下来看 从左往右的顺序:(求解也是一致的)
海明校验码 拥有 2位检错能力 和 1位纠错能力
- 海明码 还拥有一位全校验位,全体偶校验位失败如果有一位错纠正即可,如果有多位错,就需要重新传输;
03 循环冗余校验码CRC
二进制信息位流沿一条线逐位在部件之间或计算机之间传送称为串行传送;CRC(cyclic redundancy check)循环冗余校验码 是指 k 位信息码之后拼接 r 位校验码;CRC码可以发现并纠正信息存储或传送过程中连续出现的多位错误,在磁介质存储和计算机之间通信方面得到广泛应用。
- 即传送的数据码 约定一个 除数 ,添加校验位后 除法余数为0(其余也称模2除);
- 若余数非0,说明出错,则进行重传或纠错;
示例: