c語言實現CRC校驗和

最近在攝像頭採集的數據清晰度上需要加強,則在每一幀傳輸的數據包後邊加了CRC校驗和。CRC校驗和有16位的,也有32位的。至於CRC校驗和算法原理,我是在百度上學習的,其實網上有很多這種資料。簡單的說就是CRC校驗和就是將一段二進制數據進行加密(乘以一個多項式),然後得到一個校驗碼。將這個校驗碼添加在這段二進制數據後邊就行了。然後接收方在接收到數據之後,再對這個校驗碼進行解碼。
下面我就將今天的demo代碼簡單的註釋一下:
在發送方的buffer[22]中,前二十個數據爲要發送的數據,而後兩位即buffer[20]和buffer[21]中的數據就是函數int CalCrc(int crc, const char *buf, int len)產生的CRC校驗和。代碼如下:
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);//取校驗碼高八位
}
在接收方,將接收到的buffer[22]中的所有數據帶入函數int CalCrc(int crc, const char *buf, int len)中進行計算,若返回值爲0,則說明接收的數據是正確無誤的。其實在操作工程中可以使用網絡抓包軟件進行監控和驗證。
 
int result = CalCrc(0, buffer, 22);
if(result == 0)
{
  printf("數據傳輸正確");
}
整個demo的代碼如下:
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 = 0byte < 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] = {0x000x110x220x330x440x550x660x770x880x990xaa0xbb0xcc0xdd0xee0xff0x010x020x030x04};
    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;
}

發佈了51 篇原創文章 · 獲贊 21 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章