久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

CRC循環冗余算法原理

作者:佚名   來源:本站原創   點擊數:  更新時間:2014年11月22日   【字體:

Cyclic Redundancy Check循環冗余檢驗,是基于數據計算一組效驗碼,用于核對數據傳輸過程中是否被更改或傳輸錯誤。

 

算法原理

假設數據傳輸過程中需要發送15位的二進制信息g=101001110100001,這串二進制碼可表示為代數多項式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,對應g(x)中x^k的系數。將g(x)乘以x^m,既將g后加m個0,然后除以m階多項式h(x),得到的(m-1)階余項r(x)對應的二進制碼r就是CRC編碼。

h(x)可以自由選擇或者使用國際通行標準,一般按照h(x)的階數m,將CRC算法稱為CRC-m,比如CRC-32、CRC-64等。

g(x)和h(x)的除運算,可以通過g和h做xor(異或)運算。比如將11001與10101做xor運算:

明白了xor運算法則后,舉一個例子使用CRC-8算法求101001110100001的效驗碼。CRC-8標準的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二進制串111010101。

經過迭代運算后,最終得到的r是10001100,這就是CRC效驗碼。

通過示例,可以發現一些規律,依據這些規律調整算法: 

1. 每次迭代,根據gk的首位決定b,b是與gk進行運算的二進制碼。若gk的首位是1,則b=h;若gk的首位是0,則b=0,或者跳過此次迭代,上面的例子中就是碰到0后直接跳到后面的非零位。

2. 每次迭代,gk的首位將會被移出,所以只需考慮第2位后計算即可。這樣就可以舍棄h的首位,將b取h的后m位。比如CRC-8的h是111010101,b只需是11010101。 

3. 每次迭代,受到影響的是gk的前m位,所以構建一個m位的寄存器S,此寄存器儲存gk的前m位。每次迭代計算前先將S的首位拋棄,將寄存器左移一位,同時將g的后一位加入寄存器。若使用此種方法,計算步驟如下: 

※藍色表示寄存器S的首位,是需要移出的,b根據S的首位選擇0或者h。黃色是需要移入寄存器的位。S'是經過位移后的S。

查表法

同樣是上面的那個例子,將數據按每4位組成1個block,這樣g就被分成6個block。

下面的表展示了4次迭代計算步驟,灰色背景的位是保存在寄存器中的。 

經4次迭代,B1被移出寄存器。被移出的部分,不我們關心的,我們關心的是這4次迭代對B2和B3產生了什么影響。注意表中紅色的部分,先作如下定義:

   B23 = 00111010
   b1 = 00000000
   b2 = 01010100
   b3 = 10101010
   b4 = 11010101
   b' = b1 xor b2 xor b3 xor b4

4次迭代對B2和B3來說,實際上就是讓它們與b1,b2,b3,b4做了xor計算,既:

   B23 xor b1 xor b2 xor b3 xor b4

可以證明xor運算滿足交換律和結合律,于是:

   B23 xor b1 xor b2 xor b3 xor b4 = B23 xor (b1 xor b2 xor b3 xor b4) = B23 xor b'

b1是由B1的第1位決定的,b2是由B1迭代1次后的第2位決定(既是由B1的第1和第2位決定),同理,b3和b4都是由B1決定。通過B1就可以計算出b'。另外,B1由4位組成,其一共2^4有種可能值。于是我們就可以想到一種更快捷的算法,事先將b'所有可能的值,16個值可以看成一個表;這樣就可以不必進行那4次迭代,而是用B1查表得到b'值,將B1移出,B3移入,與b'計算,然后是下一次迭代。

可看到每次迭代,寄存器中的數據以4位為單位移入和移出,關鍵是通過寄存器前4位查表獲得
,這樣的算法可以大大提高運算速度。

上面的方法是半字節查表法,另外還有單字節和雙字節查表法,原理都是一樣的——事先計算出2^8或2^16個b'的可能值,迭代中使用寄存器前8位或16位查表獲得b'。
 

反向算法

之前討論的算法可以稱為正向CRC算法,意思是將g左邊的位看作是高位,右邊的位看作低位。G的右邊加m0,然后迭代計算是從高位開始,逐步將低位加入到寄存器中。在實際的數據傳送過程中,是一邊接收數據,一邊計算CRC碼,正向算法將新接收的數據看作低位。

逆向算法顧名思義就是將左邊的數據看作低位,右邊的數據看作高位。這樣的話需要在g的左邊加m0h也要逆向,例如正向CRC-16算法h=0x4c11db8,逆向CRC-16算法h=0xedb88320b的選擇0還是h,由寄存器中右邊第1位決定,而不是左邊第1位。寄存器仍舊是向左位移,就是說迭代變成從低位到高位。

 

關閉窗口

相關文章

主站蜘蛛池模板: 午夜免费在线 | 免费在线观看黄色av | 日本啊v在线 | 欧美日韩一区在线 | 2018天天干天天操 | 91福利网址 | 99精品一区二区 | 欧美一级在线免费 | 欧美在线视频一区二区 | 欧美另类视频 | 国产欧美日韩在线一区 | 亚洲色欲色欲www | 在线观看中文视频 | 色五月激情五月 | 欧美日在线 | 9久久婷婷国产综合精品性色 | 国产真实乱对白精彩久久小说 | 国产一区二区精华 | 日韩欧美一区二区在线播放 | 国产女人与拘做受视频 | 日韩精品一区二区在线 | 成人日b视频 | 麻豆视频在线看 | 中文字幕在线视频一区二区三区 | 亚洲毛片 | 免费视频一区 | av色站 | 免费黄色录像视频 | 最新中文字幕一区 | 中文字幕在线观看一区二区 | 福利视频日韩 | 日本在线视频不卡 | 久久亚洲春色中文字幕久久久 | 日本一道本 | 欧美一级片在线观看 | 精品久久久一区 | 国产精品爱久久久久久久 | 中文字幕在线观看成人 | 91视频在线看 | 久草视频观看 | 黄色免费在线网址 |