CRC16校驗演算法實現

2021-06-21 16:03:16 字數 1478 閱讀 5369

迴圈冗餘碼校驗英文名稱為cyclical redundancy check,簡稱crc。它是利用除法及餘數的原理來作錯誤偵測(error detecting)的。實際應用時,傳送裝置計算出crc值並隨資料一同傳送給接收裝置,接收裝置對收到的資料重新計算crc並與收到的crc相比較,若兩個crc值不同,則說明資料通訊出現錯誤。

根據應用環境與習慣的不同,crc又可分為以下幾種標準:

①crc-12碼;

②crc-16碼;

③crc-ccitt碼;

④crc-32碼。

crc-12碼通常用來傳送6-bit字串。crc-16及crc-ccitt碼則用是來傳送8-bit字元,其中crc-16為美國採用,而crc-ccitt為歐洲國家所採用。crc-32碼大都被採用在一種稱為point-to-point的同步傳輸中。

下面著重是crc-16檢驗碼的生成過程。

crc-16碼由兩個位元組構成,在開始時crc暫存器的每一位都預置為1,然後把crc暫存器與8-bit的資料進行異或,之後對crc暫存器從高到低進行移位,在最高位(msb)的位置補零,而最低位(lsb,移位後已經被移出crc暫存器)如果為1,則把暫存器與預定義的多項式碼進行異或,否則如果 lsb為零,則無需進行異或。重複上述的由高至低的移位8次,第乙個8-bit資料處理完畢,用此時crc暫存器的值與下乙個8-bit資料異或並進行如前乙個資料似的8次移位。所有的字元處理完成後crc暫存器內的值即為最終的crc值。

下面為crc16的計算過程,其中生成多項式為:x16+x15+x2+1:

1.設定crc暫存器,並給其賦值ffff(hex)。

2.將資料的第乙個8-bit字元與16位crc暫存器的低8位進行異或,並把結果存入crc暫存器。

3.crc暫存器向右移一位,msb補零,移出並檢查lsb。

4.如果lsb為0,重複第三步;若lsb為1,crc暫存器與生成多項式碼相異或。

5.重複第3與第4步直到8次移位全部完成。此時乙個8-bit資料處理完畢。

6.重複第2至第5步直到所有資料全部處理完成。

7.最終crc暫存器的內容即為crc值。

校驗碼實現

編寫crc校驗程式有兩種辦法:一種為計算法,一種為查表法。下面是查表法的c語言實現:

校驗碼演算法程式實現樣例(c語言):

#include "stdafx.h"

static unsigned char auchcrchi=;

static unsigned char auchcrclo=;

unsigned short crc16(unsigned char* puchmsg, unsigned short usdatalen)

return (uchcrchi << 8 | uchcrclo) ;

};void main(int argc, char* argv)

; unsigned short code = crc16(src,21);

printf("the result is %d/n",code);

}

CRC16 校驗演算法

1 迴圈校驗碼 crc碼 是資料通訊領域中最常用的一種差錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。2 生成crc碼的基本原理 任意乙個由二進位制位串組成的 都可以和乙個係數僅為 0 和 1 取值的多項式一一對應。例如 1010111對應的多項式為x6 x4 x2 x 1,而多項式為x5...

CRC16 校驗演算法原理,以及C 例子

1 迴圈校驗碼 crc碼 是資料通訊領域中最常用的一種差錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。2 生成crc碼的基本原理 任意乙個由二進位制位串組成的 都可以和乙個係數僅為 0 和 1 取值的多項式一一對應。例如 1010111對應的多項式為x6 x4 x2 x 1,而多項式為x5...

CRC 16校驗原理

1 迴圈校驗碼 crc碼 是資料通訊領域中最常用的一種差錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。2 生成crc 碼的基本原理 任意乙個由二進位制位串組成的 都可以和乙個係數僅為 0 和 1 取值的多項式一一對應。例如 1010111 對應的多項式為x6 x4 x2 x 1 而多項式為...