crc即迴圈冗餘校驗碼:是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查(crc)是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。
模2除法
模2除法與算術除法類似,但每一位除的結果不影響其它位,即不向上一位借位,所以實際上就是異或。在迴圈冗餘校驗碼(crc)的計算中有應用到模2除法。
關鍵點
crc校驗中有兩個關鍵點,一是預先確定乙個傳送送端和接收端都用來作為除數的二進位制位元串(或多項式),可以隨機選擇,也可以使用國際標準,但是最高位和最低位必須為1;二是把原始幀與上面計算出的除數進行模2除法運算,計算出crc碼。
具體步驟
選擇合適的多項式,確定除數。
看選定多項式的二進位制位數,然後將要傳送的資料上面加上這個位數-1位的0,然後用得到的資料以模2除法的方式除上面確定的除數,得到的餘數就是該數的crc校驗碼。注意,餘數的位數一定只比除數字數少一位,也就是crc校驗碼位數比除數字數少一位,如果前面位是0也不能省略。
示例
現假設我們使用的多項式為:g(x) = x^8+x^2+x^1+1
,要求出0x1a
的crc-8校驗碼。下面是具體的計算過程:
將多項式轉化為二進位制序列,由g(x) = x^8+x^2+x^1+1
可知二進位制一種有9位,第8位、第2位、第1位和第0位分別為1,則序列為100000111
。
原來要計算的資料為1 1010
,多項式的最高次為8,則在資料的後面加上8位0,資料變為1 1010 0000 0000
,然後使用模2除法除以除數100000111
,最終得到的除不盡的餘數,變為我們要求的crc-8結果。
計算過程如下圖:
如上圖,最後除不盡的餘數為0x46,所以0x1a
按多項式g(x) = x8+x2+x+1
計算得到的crc-8碼為0x46。
crc-8的計算軟體上可以採用迴圈計算的方法,也可以採用查表法,下面的**都是以多項式g(x) = x^8+x^2+x^1+1
來實現,其他的多項式也類似。
從上面的計算過程可以看到,多項式最高位為1,遇到需要異或資料最高位為1時, 才進行異或計算,並且異或後,最高位就為0了,最高位為0,下次也不需要異或了, 這樣需要採用**計算的方式,就可以把最高位去掉,不需要異或,最後結果也是一樣的。
#define factor (0x107 & 0xff)
//多項式因子(取低8bit)
unsigned
char
calccrc
(unsigned
char
*pdat,
unsigned
int len)
else}}
return crc;
}
查表法實際上就是採用法1中的方法,對0x00~0xff計算crc8,然後按順序儲存到陣列裡面,在需要計算crc8的時候,通過查詢這個陣列得到crc8。
// 按照多項式 x^8+x^2+x^1+1 生成。
static
const
unsigned
int crc8table[
256]=;
// 計算crc
unsigned
char
calccrc
(unsigned
char
*data,
unsigned
int len)
return crc8;
}
CRC校驗原理及步驟
什麼是crc校驗?crc即迴圈冗餘校驗碼 是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。crc校驗原理 ...
CRC校驗原理及步驟
什麼是crc校驗?crc即迴圈冗餘校驗碼 是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。crc校驗原理 ...
CRC校驗原理及步驟
什麼是crc校驗?crc即迴圈冗餘校驗碼 是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。crc校驗原理 ...