1. 程式人生 > >CRC校驗的理解和C語言實現

CRC校驗的理解和C語言實現

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; }