1. 程式人生 > >(原創)CRC計算流程分析(RefIn,Init,RefOut,XorOut)

(原創)CRC計算流程分析(RefIn,Init,RefOut,XorOut)

CRC的計算流程

以此CRC計算程式為例,

1、輸入:原資料是ASCII碼的“A”,對應二進位制資料“0100 0001”

2、選擇校驗方式,以CRC-4/ITU為例,多項式為x4+x+1對應二進位制:10011

3、引數Info

1)Name:CRC校驗演算法的名稱(CRC-4/ITU);

2)Width:CRC校驗值的長度(此例中10011長度為5);

3)Poly:多項式(省略了最高位的1;即10011==》0011=0x3);

4)RefIn:輸入反轉,為ture時反轉,false時不反轉

RefIn的反轉:

在計算輸入反轉時,反轉的操作是針對每一個位元組的bit位進行反轉,位元組資料之間仍保持原有順序

5)Init:該引數的值有兩種形式:全為0,全為1

在判定並執行RefIn之後:

當Init全為1時,表示在演算法開始前對資料的前CRC位數(高位)先和對應位數個1進行異或(即:前CRC位數的值按位取反),再在後面補上CRC位數個0,才進行後續計算。

當Init全為0時,在演算法開始前對資料(這個資料是根據RefIn的值得到的)後面補上CRC位數個0後就可以進行後續計算;

6)RefOut-輸出反轉

備註:RefIn和RefOut這兩個值同時為ture或者同時為false

RefOut的反轉:

是將計算獲得的CRC碼整體進行反轉,而不是像RefIn一樣僅反轉位元組內的bit;

6)XorOut:表示執行完RefOut之後,對結果進行異或全0或者全1(該例中為全0異或)。

7)本例計算過程如下:

原始資料“A”對應的ASCII碼得到資料1:0100 0001

採用了CRC-4/ITU多項式X4+X+1的演算法,得到除數資料2:10011

由於RefIn=ture,輸入資料進行反轉,並補4個0,得到資料3:1000 0010 0000

資料3(被除數)和資料2(除數)做模2除法,得到資料3:1000

RefOut為ture且XorOut=0x00,輸出資料進行反轉,然後和0000進行異或,得到最終的校驗碼:CRC=0001

9)關於XorOut的用法,再舉一個例子:

原始資料“A”對應的ASCII碼得到資料1:0100 0001

採用了CRC-5/USB多項式X5+X2+1的演算法,得到除數資料2:100101

先反轉(反轉的優先順序高於Init的計算優先順序),資料3:1000 0010

資料3的最高5位(width)的和Init:11111異或,得到資料4:111 1010

補5位(width)得到資料6:111 1010 00000

資料6與資料2,模2除法,得到資料7:01011

由於RefOut=ture,反轉資料7得到資料8:11010

由於XorOut=0x1F=11111,資料8與11111進行異或運算,得到最終CRC:00101