計(jì)算原理:首先把前面兩個(gè)數(shù)據(jù)整合成一個(gè)16bit數(shù)據(jù),對多項(xiàng)式進(jìn)行異或運(yùn)算,求出余數(shù)再加上后面的一個(gè)字節(jié)數(shù)據(jù),在進(jìn)行求余,以此類推,加到最后一個(gè)數(shù)據(jù)結(jié)束后,別忘了后面還需要對數(shù)據(jù)進(jìn)行補(bǔ)充8個(gè)0,于是在左移動8位,對多項(xiàng)式求余數(shù),最后所得為crc值。
uchar crc_8(uchar data_1,uchar data_2,uchar data_3,uchar data_4) { long data,crc_cal,msb_det; uchar bit_num=16; uint crc_data; crc_cal=0x107;// msb_det=0x8000; data=data_1; data<<=8; data=data+data_2; while(bit_num>=9) { if ((data&msb_det)==0)//判斷最高位 { msb_det=msb_det>>1; bit_num--; } data=data^(crc_cal<<(bit_num-9)); } data=(data<<8)|data_3; bit_num=bit_num+8; msb_det=0x8000; while(bit_num>=9) { if ((data&msb_det)==0)//判斷最高位 { msb_det=msb_det>>1; bit_num--; } data=data^(crc_cal<<(bit_num-9)); } data=(data<<8)|data_4; bit_num=bit_num+8; msb_det=0x8000; while(bit_num>=9) { if ((data&msb_det)==0)//判斷最高位 { msb_det=msb_det>>1; bit_num--; } data=data^(crc_cal<<(bit_num-9)); } data=data<<8; bit_num=bit_num+8; msb_det=0x8000; while(bit_num>=9) { if ((data&msb_det)==0)//判斷最高位
{ msb_det=msb_det>>1; bit_num--; } data=data^(crc_cal<<(bit_num-9)); } crc_data=data; return crc_data; }
|