1、CRC(循环冗余码)
校验和的算法为:
所有各字节的和模256的余。即各字节二进制算术和,不计超过256的溢出值(即只取其和
的低8位数据),然后用0x100减去这个算数累加和,得出得值就是此行得校验和。
例如:(16进制数) 10 00 10 00 18 F0 9F E5 80 5F 20 B9 F0 FF 1F E5 18 F0 9F E5。
这串数据的CRC校验和为:
byte checksum=10+00+10+00+18+F0+9F+E5+80+5F+20+B9+F0+FF+1F+E5+18+F0+9F+E5;
checksum=0x100-checksum;(结果为0x1D);
2、奇偶校验法
大家都知道,信息是以比特流的方式传输的,类似01000001。在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1。为了检测到这种错误,我们可以通过“奇偶校验”来实现。假如,我们存储的数据是一个字节,8个比特位,那我们就可以计算每个字节比特位是1的个数,如果是偶数个1,那么,我们就把第九个位设为1,如果是奇数个1,那么就把第九个位设为0,这样连续9个字节比特位为1的位数肯定是奇数。这中方法叫做“奇校验”,“偶校验”和此类似。当然,在实际应用中,也可以把一个字节的前7位作为数据位,最后一个为作为校验位。
3、CRC16的算法
也是求余,但还没有搞清楚,只验证了它的程序,如下
word CalculateCRC16(uchar* ptr, uchar len){
uchar i;
word crc=0xffff; //CRC的初始值,值不同则结果也不同,看具体要求
while(len--)
{
for(i=0x80; i!=0; i>>=1)
{
if((crc&0x8000)!=0)
{crc<<=1; crc^=0x1021;} //0x1021表示其中的CCITT值,此值可能不同
else crc<<=1;
if((*ptr&i)!=0)
crc^=0x1021;
}
ptr++;
}
return(crc);
}
如上程序,如果CRC初始值为0xffff;CCITT=0x1021。求数组byte RcvSCIData_Buf[LEN]={0xab,0x02,0x04,0xcc,0x00}的CRC值为0xb506。