校验码:为避免接收的数据不是所传输的数据,在数据传输过程中,用于发现错误以及纠正错误的数据编码。
一种编码方案中,任意两个合法码字之间最少变化的二进制位数,称为码距。即接收的数据和传输的数据都是合法码字,两者之间有多少位不同,码距就是多少。一般,码距超过2(含2),有检错能力;码距超过3,有纠错能力。
校验码有奇偶校验码、海明校验码、循环冗余校验码(CRC码)等。
奇偶校验码
奇校验:一般在最左边添加一位校验位,保证整个数据(含校验位)中的1的个数是奇数。
偶校验:一般在最左边添加一位校验位,保证整个数据(含校验位)中的1的个数是偶数。
局限性:只能检测出奇数位的错误。而且不知道错在哪里(无纠错能力)。
若错误是偶数位,奇校验码中1的个数仍为奇数,偶校验码中1的个数仍为偶数,发现不了错误。
【补充】异或:两者相同,结果为0;两者不同,结果为1。
海明校验码
通过多个校验位进行分组校验。
校验步骤:
第一步:计算需要多少校验位。(假设:信息位n位,校验位k位,n+k+1)
第二步:确定校验位和信息位的位置。(第i个校验位的位置为,信息位依次在剩余位置)
第三步:确定分组和校验位的值。( 位置号从1开始,每个信息位的位置号用二进制表示,所有信息位的每一个相同二进制位对应一个校验位,其中二进制位为1对应的信息位和对应校验位作为一组。而校验位的值为所在组的信息位内容的异或)
第四步:纠错。(接收到数据,将每组和对应校验位异或,结果不全为0则出错,结果全为0则未出错)
局限性:2位检错能力,1位纠错能力。(最多检测出2位错误。若检测出1位错误,可以知道错误在哪。若检测出2位错误,不知道具体错误在哪。)
实际应用中,会在海明码的基础上,再最前面加上全校验位对整体进行偶校验。
若海明码纠错结果都为0且偶校验为0,无错误。
若海明码纠错结果不全为0且偶校验也不为0,有1位错误,根据错误位置纠正即可。
若海明码纠错结果不全为0但偶校验为0,有2位错误,需重新传输。
循环冗余校验码(CRC码)
循环冗余校验码(CRC码,Cyclic Redundancy Check)
校验步骤:
第一步:确定需要多少校验位。(生成多项式的最高次幂是多少,校验位就是多少位)
第二步:确定除数。(生成多项式的幂由高到低对应的数位码)
第三步:校验位多少位,信息位就左移多少位,补0。然后除以(模2除)除数,余数为真正的校验位的值。
第四步:纠错。(接收的数据除以(模2除)除数,余数为0则未出错,否则出错)
假设,校验位3位,即余数3位,则有8种状态(),其中余数000是未出错,其余余数为出错,超过8,出错的余数将循环相同(都在1-7之间)。
若含校验位在内的数据位数小于8,则可以检测出一位错误在哪。(即信息位n位,校验位k位,n+k+1)。
但,一般在网络通信中使用循环冗余校验码,通常检测出错误即可。