检验和算法

2019-04-13 12:14发布


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。