CRC校驗的理解和C語言實現
阿新 • • 發佈:2019-01-10
1、CRC是什麼
CRC檢驗的基本思想是利用線性編碼理論,在傳送端根據要傳送的k位二進位制碼序列,以一定的規則產生一個檢驗碼r位(就是CRC碼),附在資訊後面,構成一個新的二進位制碼序列數共(k+r)位,最後傳送出去。接收端根據同樣的規則校驗,以確定傳送中是否出錯。接收端有兩種處理方式:1、計算k位序列的CRC碼,與接收到的CRC比較,一致則接收正確。2、計算整個k+r位的CRC碼,若為0,則接收正確。
CRC碼有多種檢驗位數,8位、16位、32位等,原理相同。16位的CRC碼產生的規則是先將要傳送的二進位制序列數左移16位(即乘以2的16次方後),除以一個多項式,最後所得到的餘數就是CRC碼。
求CRC碼所採用的是模2運演算法則,即多項式除法中採用不帶借位的減法運算,運算等同於異或運算。
2.傳送端
int main()
{
char buffer[22] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x01, 0x02, 0x03, 0x04};
int crc = CalCrc(0, buffer, 20);//crc為16位校驗碼
buffer[21] = (char)crc;//取校驗碼低八位
buffer[20] = (char)(crc >> 8);//取校驗碼高八位
}
3.接收端
int result = CalCrc(0 , buffer, 22);
if(result == 0)
{
printf("資料傳輸正確");
}
4.完整程式碼
int CalCrc(int crc, const char *buf, int len)
{
unsigned int byte;
unsigned char k;
unsigned short ACC,TOPBIT;
// unsigned short remainder = 0x0000;
unsigned short remainder = crc;
TOPBIT = 0x8000;
for (byte = 0; byte < len; ++byte )
{
ACC = buf[byte];
remainder ^= (ACC <<8);
for (k = 8; k > 0; --k)
{
if (remainder & TOPBIT)
{
remainder = (remainder << 1) ^0x8005;
}
else
{
remainder = (remainder << 1);
}
}
}
remainder=remainder^0x0000;
return remainder;
}
int main(int argc, _TCHAR* argv[])
{
char buffer[22] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x01, 0x02, 0x03, 0x04};
int crc = CalCrc(0, buffer, 20);//計算得到的16位CRC校驗碼
buffer[21] = (char)crc;//取校驗碼的低八位
buffer[20] = (char)(crc >> 8);//取校驗碼的高八位
//接收方在接收到buffer中的資料時,代入CalCrc進行計算,若result的值為0,則說明資料傳輸過程無誤
int result = CalCrc(0, buffer, 22);
return 0;
}