CRC

 標準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+{Y[n]×256/G17+BYTE[n-1]×256^2/G17}×256^(n-1)+...+BYTE[1]×256×256^2/G17+BYTE[0]×256^2/G17
         =Z[n]×256^n+{(YH8[n]×256+YHL[n])×256/G17+BYTE[n-1]×256^2/G17}×256^(n-1)+...+BYTE[1]×256×256^2/G17+BYTE[0]×256^2/G17
         =Z[n]×256^n+{YHL[n]×256/G17+(YH8[n]+BYTE[n-1])×256^2/G17}×256^(n-1)+...+BYTE[1]×256×256^2/G17+BYTE[0]×256^2/G17
    這樣就推導出,BYTE[n-1]字節的CRC校驗碼爲{YHL[n]×256/G17+(YH8[n]+BYTE[n-1])×256^2/G17},即上一字節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

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