crc校驗和crc各種演算法
1、簡介
crc即
迴圈冗餘校驗碼
(cyclic redundancy check
):是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查(crc)是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。
2、工作原理
迴圈冗餘校驗碼(crc)的基本原理是:在k位資訊碼後再拼接r位的校驗碼,整個編碼長度為n位,因此,這種編碼也叫(n,k)碼。對於乙個給定的(n,k)碼,可以證明存在乙個
最高次冪為n-k=r的多項式g(x)。根據g(x)可以生成k位資訊的校驗碼,而g(x)叫做這個crc碼的生成多項式。 校驗碼的具體生成過程為:假設要傳送的資訊用多項式c(x)表示,將c(x)左移r位(可表示成c(x)*2
r),這樣c(x)的右邊就會空出r位,這就是校驗碼的位置。用 c(x)*2
r 除以生成多項式g(x)得到的餘數就是校驗碼。
任意乙個由二進位制位串組成的**都可以和乙個係數僅為『0』和『1』取值的多項式一一對應。例如:**1010111對應的
多項式為x
6+x
4+x
2+x+1,而多項式為x
5+x
3+x
2+x+1對應的**101111。
3、crc16 三種演算法及c實現
標準crc生成多項式如下表:
名稱 生成多項式 簡記式* 標準引用
crc-4 x4+x+1 3 itu g.704
crc-8 x8+x5+x4+1 0x31
crc-8 x8+x2+x1+1 0x07
crc-8 x8+x6+x4+x3+x2+x1 0x5e
crc-12 x12+x11+x3+x+1 80f
crc-16 x16+x15+x2+1 8005 ibm sdlc
crc16-ccitt x16+x12+x5+1 1021 iso hdlc, itu x.25, v.34/v.41/v.42, ppp-fcs
crc-32 x32+x26+x23+...+x2+x+1 04c11db7 zip, rar, ieee 802 lan/fddi, ieee 1394, ppp-fcs
crc-32c x32+x28+x27+...+x8+x6+1 1edc6f41 sctp
生成多項式的最高位固定的1,故在簡記式中忽略最高位1了,如0x1021實際是0x11021。
i、基本演算法(人工筆算):
以crc16-ccitt為例進行說明,crc校驗碼為16位,生成多項式17位。假如資料流為4位元組:byte[3]、byte[2]、byte[1]、byte[0];
資料流左移16位,相當於擴大256×256倍,再除以生成多項式0x11021,做不借位的除法運算(相當於按位異或),所得的餘數就是crc校驗碼。
傳送時的資料流為6位元組:byte[3]、byte[2]、byte[1]、byte[0]、crc[1]、crc[0];
注意:使用長除法進行計算式,需要將除數多項式與預置位0x0000或0xffff異或以後再進行計算。
ii、計算機演算法1(位元型演算法):
1)將擴大後的資料流(6位元組)高16位(byte[3]、byte[2])放入乙個長度為16的暫存器;
2)如果暫存器的首位為1,將暫存器左移1位(暫存器的最低位從下乙個位元組獲得),再與生成多項式的簡記式異或;
否則僅將暫存器左移1位(暫存器的最低位從下乙個位元組獲得);
3)重複第2步,直到資料流(6位元組)全部移入暫存器;
4)暫存器中的值則為crc校驗碼crc[1]、crc[0]。
iii、計算機演算法2(位元組型演算法):256^n表示256的n次方
把按位元組排列的資料流表示成數學多項式,設資料流為byte[n]byte[n-1]byte[n-2]、、、byte[1]byte[0],表示成數學表示式為byte[n]×256^n+byte[n-1]×256^(n-1)
+...+byte[1]*256+byte[0],在這裡+表示為異或運算。設生成多項式為g17(17bit),crc碼為crc16。
則,crc16=(byte[n]×256^n+byte[n-1]×256^(n-1)+...+byte[1]×256+byte[0])×256^2/g17,即資料流左移16位,再除以生成多項式g17。
先變換byte[n-1]、byte[n-1]擴大後的形式,
crc16=byte[n]×256^n×256^2/g17+byte[n-1]×256^(n-1)×256^2/g17+...+byte[1]×256×256^2/g17+byte[0]×256^2/g17
=(z[n]+y[n]/g17)×256^n+byte[n-1]×256^(n-1)×256^2/g17+...+byte[1]×256×256^2/g17+byte[0]×256^2/g17
=z[n]×256^n+×256^(n-1)+...+byte[1]×256×256^2/g17+byte[0]×256^2/g17
=z[n]×256^n+×256^(n-1)+...+byte[1]×256×256^2/g17+byte[0]×256^2/g17
=z[n]×256^n+×256^(n-1)+...+byte[1]×256×256^2/g17+byte[0]×256^2/g17
這樣就推導出,byte[n-1]位元組的crc校驗碼為,即上一位元組crc校驗碼y[n]的高8位(yh8[n])與本位元組byte[n-1]異或,
該結果單獨計算crc校驗碼(即單位元組的16位crc校驗碼,對單位元組可建立**,預先生成對應的16位crc校驗碼),所得的crc校驗碼與上一位元組crc校驗碼y[n]的低8位(yl8[n])
乘以256(即左移8位)異或。然後依次逐個位元組求出crc,直到byte[0]。
位元組型演算法的一般描述為:本位元組的crc碼,等於上一位元組crc碼的低8位左移8位,與上一位元組crc右移8位同本位元組異或後所得的crc碼異或。
位元組型演算法如下:
1)crc暫存器組初始化為全"0"(0x0000)。(注意:crc暫存器組初始化全為1時,最後crc應取反。)
2)crc暫存器組向左移8位,並儲存到crc暫存器組。
3)原crc暫存器組高8位(右移8位)與資料位元組進行異或運算,得出乙個指向值表的索引。
4)索引所指的錶值與crc暫存器組做異或運算。
5)資料指標加1,如果資料沒有全部處理完,則重複步驟2)。
6)得出crc。
crc ccitt—1,「-1」的意思是crc的初值為0xffff。
方法1:將存有資料的位元組陣列進行逐位計算,求得位元組形式的crc
typedef unsigned __int16 int16u;
#define crc_seed 0xffff // 該位稱為預置值,使用人工演算法(長除法)時 需要將除數多項式先與該與職位 異或 ,才能得到最後的除數多項式
#define poly16 0x1021 // 該位為簡式書寫 實際為0x11021
int16u crc16(unsigned char *buf,unsigned short length)
;unsigned short crc_ccitt(unsigned char *q, int len)
crc校驗和crc各種演算法
資料校驗 CRC校驗
工作原理 crc即迴圈冗餘校驗碼 cyclic redundancy check 是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資...
迴圈冗餘校驗CRC演算法
本文參考自 crc校驗 迴圈冗餘校驗 是資料通訊中最常採用的校驗方式。在嵌入式軟體開發中,經常要用到crc 演算法對各種資料進行校驗。因此,掌握基本的crc演算法應是嵌入式程式設計師的基本技能。其實,在網上有一篇介紹crc 演算法的非常好的文章,作者是ross williams,題目叫 a pain...
演算法 迴圈冗餘校驗(CRC)
迴圈冗餘校驗 cyclic redundancy check,crc 是一種根據網路資料報或電腦檔案等資料產生簡短固定位數校驗碼的一種雜湊函式,主要用來檢測或校驗資料傳輸或者儲存後可能出現的錯誤。它是利用除法及餘數的原理來作錯誤偵測的。工作原理 在對資訊的處理過程中,我們可以將要被處理的資料塊m看成...