校驗和算法


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM