迴圈冗餘碼校驗英文名稱為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 而多項式為...