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。
