循環冗餘碼crc

待編碼的有效信息組多項式:M(x)算法

生成多項式(產生校驗碼的多項式):G(x)優化

餘數多項式:R(x)網站

商:Q(x)編碼

生成多項式是四次的,因此某個多項式除以生成多項式的餘式確定是三次的,因此要加四位0000。.net

 

生成多項式的選擇是通過實際應用選擇出來的,要知足必定的要求。字符串

R(x)爲r階,在M(x)後面添上r個0(R(x)有r + 1 位)。it

M(x)*x^k = Q(x)*G(x) + R(x)效率

 

模2運算擴展

crc碼是基於模2運算而創建編碼規律的校驗碼。模2運算的特色是不考慮進位和借位的運算。其規律以下:循環

一、模2加和模2減的結果是相等的,即:0 +/- 1 = 1, 0 +/- 0 = 0, 1 +/- 0 = 1, 1 +/- 1 = 0。兩個相同的數的模2和恆爲0。

二、模2乘是按模2和求部分積之和。(和十進制乘法相似)

三、模2除是按模2減求部分餘數。每求一位商應使部分餘數減小一位。上商的原則是:當部分餘數的首位爲1時,上商1;當部分餘數的首位爲0時,上商0。當部分餘數的位數小於除數的位數時,該餘數即爲最後餘數。

               1 1 1 0
            ────────
1 0 1 1〕1 1 0 0 1 0 0
          -1 0 1 1
             ──────
               1 1 1 1
           - 1 0 1 1
              ──────
                 1 0 0 0
             - 1 0 1 1
                ──────
                   0 1 1 0
               - 0 0 0 0
                  ──────
                     1 1 0

例如M(x)=1100

G(x)=1011

用1100000 除以 1011得crc碼爲1100010

有效信息爲4位,校驗位爲3位,因此有稱爲(7,4)碼。

 

校驗方法:

將收到的循環校驗碼用約定的生成多項式G(x)去除,若是無錯,則餘數應爲0;若是某一位出錯,則餘數不爲0,不一樣的出錯爲對應不一樣的餘數。對餘數補0後繼續除下去,餘數將按照必定的序列循環下去(循環碼的由來)。

 

 

 

 

具體可參考:http://bbs.csdn.net/topics/50365367

如下是在這個網站摘錄的筆記:

 

CRC校驗碼的編碼方法是用待發送的二進制數據t(x)除以生成多項式g(x),將最後的餘數做爲CRC校驗碼。其實現步驟以下: (1) 設待發送的數據塊是m位的二進制多項式t(x),生成多項式爲r階的g(x)。在數據塊的末尾添加r個0,數據塊的長度增長到m+r位,對應的二進制多項式爲 。 (2) 用生成多項式g(x)去除 ,求得餘數爲階數爲r-1的二進制多項式y(x)。此二進制多項式y(x)就是t(x)通過生成多項式g(x)編碼的CRC校驗碼。 (3) 用 以模2的方式減去y(x),獲得二進制多項式 。 就是包含了CRC校驗碼的待發送字符串。 從CRC的編碼規則能夠看出,CRC編碼其實是將代發送的m位二進制多項式t(x)轉換成了能夠被g(x)除盡的m+r位二進制多項式 ,因此解碼時可 以用接受到的數據去除g(x),若是餘數位零,則表示傳輸過程沒有錯誤;若是餘數不爲零,則在傳輸過程當中確定存在錯誤。許多CRC的硬件解碼電路就是按這 種方式進行檢錯的。同時 能夠看作是由t(x)和CRC校驗碼的組合,因此解碼時將接收到的二進制數據去掉尾部的r位數據,獲得的就是原始數據。 爲了更清楚的瞭解CRC校驗碼的編碼過程,下面用一個簡單的例子來講明CRC校驗碼的編碼過程。因爲CRC-3二、CRC-1六、CCITT和CRC-4的編碼過程基本一致,只有位數和生成多項式不同。爲了敘述簡單,用一個CRC-4編碼的例子來講明CRC的編碼過程。 設待發送的數據t(x)爲12位的二進制數據100100011100;CRC-4的生成多項式爲g(x)= ,階數r爲4,即10011。首先在 t(x)的末尾添加4個0構成 ,數據塊就成了1001000111000000。而後用g(x)去除 ,不用管商是多少,只須要求得餘數y(x)。下表 爲給出了除法過程。 除數次數 被除數/ g(x)/結果     餘數 0  1 001000111000000 100111000000  1 0011  0 000100111000000 1  1 00111000000   1000000  1 0011   0 00001000000 2  1 000000 1100  1 0011  0 001100 從上面表中能夠看出,CRC編碼其實是一個循環移位的模2運算。對CRC-4,咱們假設有一個5 bits的寄存器,經過反覆的移位和進行CRC的除法,那麼最終該寄存器中的值去掉最高一位就是咱們所要求的餘數。因此能夠將上述步驟用下面的流程描述: //reg是一個5 bits的寄存器 把reg中的值置0.  把原始的數據後添加r個0.  While (數據未處理完)  Begin  If (reg首位是1)  reg = reg XOR 0011.  把reg中的值左移一位,讀入一個新的數據並置於register的0 bit的位置。  End reg的後四位就是咱們所要求的餘數。 這種算法簡單,容易實現,對任意長度生成多項式的G(x)都適用。在發送的數據不長的狀況下可使用。可是若是發送的數據塊很長的話,這種方法就不太適合 了。它一次只能處理一位數據,效率過低。爲了提升處理效率,能夠一次處理4位、8位、16位、32位。因爲處理器的結構基本上都支持8位數據的處理,因此 一次處理8位比較合適。 爲了對優化後的算法有一種直觀的瞭解,先將上面的算法換個角度理解一下。在上面例子中,能夠將編碼過程看做以下過程:  因爲最後只須要餘數,因此咱們只看後四位。構造一個四位的寄存器reg,初值爲0,數據依次移入reg0(reg的0位),同時reg3的數據移出 reg。有上面的算法能夠知道,只有當移出的數據爲1時,reg才和g(x)進行XOR運算;移出的數據爲0時,reg不與g(x)進行XOR運算,至關 與和0000進行XOR運算。就是說,reg和什麼樣的數據進行XOR移出的數據決定。因爲只有一個bit,因此有 種選擇。上述算法能夠描述以下, //reg是一個4 bits的寄存器 初始化t[]={0011,0000} 把reg中的值置0.  把原始的數據後添加r個0.  While (數據未處理完)  Begin  把reg中的值左移一位,讀入一個新的數據並置於register的0 bit的位置。 reg = reg XOR t[移出的位] End 上面算法是以bit爲單位進行處理的,能夠將上述算法擴展到8位,即以Byte爲單位進行處理,即CRC-32。構造一個四個Byte的寄存器reg,初 值爲0x00000000,數據依次移入reg0(reg的0字節,如下相似),同時reg3的數據移出reg。用上面的算法類推可知,移出的數據字節決 定reg和什麼樣的數據進行XOR。因爲有8個bit,因此有 種選擇。上述算法能夠描述以下: //reg是一個4 Byte的寄存器 初始化t[]={…}//共有 =256項 把reg中的值置0.  把原始的數據後添加r/8個0字節.  While (數據未處理完)  Begin  把reg中的值左移一個字節,讀入一個新的字節並置於reg的第0個byte的位置。 reg = reg XOR t[移出的字節] End 算法的依據和多項式除法性質有關。若是一個m位的多項式t(x)除以一個r階的生成多項式g(x), ,將每一位 (0=<k<m)提出來, 在後面不足r個0後,單獨去除g(x),獲得的餘式位 。則將 後獲得的就是t(x)由生成多項式g(x)獲得的餘式。對於CRC-32,能夠將每一個字節 在後面補上32個0後與生成多項式進行運算,獲得餘式和此字節惟一對應,這個餘式就是上面算法種t[]中的值,因爲一個字節有8位,因此t[]共 有 =256項。多項式運算性質能夠參見參考文獻[1]。這種算法每次處理一個字節,經過查表法進行運算,大大提升了處理速度,故爲大多數應用所採用。 摘自:循環冗餘校驗 CRC的算法分析和程序實現 西南交通大學計算機與通訊工程學院  劉東

相關文章
相關標籤/搜索