青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

TagCRC    算法分析    程序實現    c++                                          

循環冗余校驗 CRC的算法分析和程序實現

西南交通大學計算機與通信工程學院  劉東
摘要   通信的目的是要把信息及時可靠地傳送給對方,因此要求一個通信系統傳輸消息必須可靠與快速,在數字通信系統中可靠與快速往往是一對矛盾。為了解決可靠性,通信系統都采用了差錯控制。本文詳細介紹了循環冗余校驗CRC(Cyclic Redundancy Check)的差錯控制原理及其算法實現。


關鍵字  通信 循環冗余校驗  CRC-32  CRC-16  CRC-4


概述
在數字通信系統中可靠與快速往往是一對矛盾。若要求快速,則必然使得每個數據碼元所占地時間縮短、波形變窄、能量減少,從而在受到干擾后產生錯誤地可能性增加,傳送信息地可靠性下降。若是要求可靠,則使得傳送消息地速率變慢。因此,如何合理地解決可靠性也速度這一對矛盾,是正確設計一個通信系統地關鍵問題之一。為保證傳輸過程的正確性,需要對通信過程進行差錯控制。差錯控制最常用的方法是自動請求重發方式(ARQ)、向前糾錯方式(FEC)和混合糾錯(HEC)。在傳輸過程誤碼率比較低時,用FEC方式比較理想。在傳輸過程誤碼率較高時,采用FEC容易出現“亂糾”現象。HEC方式則式ARQ和FEC的結合。在許多數字通信中,廣泛采用ARQ方式,此時的差錯控制只需要檢錯功能。實現檢錯功能的差錯控制方法很多,傳統的有:奇偶校驗、校驗和檢測、重復碼校驗、恒比碼校驗、行列冗余碼校驗等,這些方法都是增加數據的冗余量,將校驗碼和數據一起發送到接受端。接受端對接受到的數據進行相同校驗,再將得到的校驗碼和接受到的校驗碼比較,如果二者一致則認為傳輸正確。但這些方法都有各自的缺點,誤判的概率比較高。
循環冗余校驗CRC(Cyclic Redundancy Check)是由分組線性碼的分支而來,其主要應用是二元碼組。編碼簡單且誤判概率很低,在通信系統中得到了廣泛的應用。下面重點介紹了CRC校驗的原理及其 算法實現。


一、循環冗余校驗碼(CRC)
CRC校驗采用多項式編碼方法。被處理的數據塊可以看作是一個n階的二進制多項式,由 。如一個8位二進制數10110101可以表示為: 。多項式乘除法運算過程與普通代數多項式的乘除法相同。多項式的加減法運算以2為模,加減時不進,錯位,和邏輯異或運算一致。
采用CRC校驗時,發送方和接收方用同一個生成多項式g(x),并且g(x)的首位和最后一位的系數必須為1。CRC的處理方法是:發送方以g(x)去除t(x),得到余數作為CRC校驗碼。校驗時,以計算的校正結果是否為0為據,判斷數據幀是否出錯。
CRC校驗可以100%地檢測出所有奇數個隨機錯誤和長度小于等于k(k為g(x)的階數)的突發錯誤。所以CRC的生成多項式的階數越高,那么誤判的概率就越小。CCITT建議:2048 kbit/s的PCM基群設備采用CRC-4方案,使用的CRC校驗碼生成多項式g(x)= 。采用16位CRC校驗,可以保證在  bit碼元中只含有一位未被檢測出的錯誤 。在IBM的同步數據鏈路控制規程SDLC的幀校驗序列FCS中,使用CRC-16,其生成多項式g(x)= ;而在CCITT推薦的高級數據鏈路控制規程HDLC的幀校驗序列FCS中,使用CCITT-16,其生成多項式g(x)= 。CRC-32的生成多項式g(x)= 。CRC-32出錯的概率比CRC-16低 倍 。由于CRC-32的可靠性,把CRC-32用于重要數據傳輸十分合適,所以在通信、計算機等領域運用十分廣泛。在一些UART通信控制芯片(如MC6582、Intel8273和Z80-SIO)內,都采用了CRC校驗碼進行差錯控制;以太網卡芯片、MPEG解碼芯片中,也采用CRC-32進行差錯控制。
二、CRC校驗碼的算法分析
CRC校驗碼的編碼方法是用待發送的二進制數據t(x)除以生成多項式g(x),將最后的余數作為CRC校驗碼。其實現步驟如下:
(1) 設待發送的數據塊是m位的二進制多項式t(x),(2) 生成多項式為r階的g(x)。在數據塊的末尾添加r個0,(3) 數據塊的長度增加到m+r位,(4) 對應的二進制多項式為 。
(5) 用生成多項式g(x)去除 ,(6) 求得余數為階數為r-1的二進制多項式y(x)。此二進制多項式y(x)就是t(x)經過生成多項式g(x)編碼的CRC校驗碼。
(7) 用 以模2的方式減去y(x),(8) 得到二進制多項式 。 就是包含了CRC校驗碼的待發送字符串。
從CRC的編碼規則可以看出,CRC編碼實際上是將代發送的m位二進制多項式t(x)轉換成了可以被g(x)除盡的m+r位二進制多項式 ,所以解碼時可以用接受到的數據去除g(x),如果余數位零,則表示傳輸過程沒有錯誤;如果余數不為零,則在傳輸過程中肯定存在錯誤。許多CRC的硬件解碼電路就是按這種方式進行檢錯的。同時 可以看做是由t(x)和CRC校驗碼的組合,所以解碼時將接收到的二進制數據去掉尾部的r位數據,得到的就是原始數據。
為了更清楚的了解CRC校驗碼的編碼過程,下面用一個簡單的例子來說明CRC校驗碼的編碼過程。由于CRC-32、CRC-16、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-32的程序實現。
為了提高編碼效率,在實際運用中大多采用查表法來完成CRC-32校驗,下面是產生CRC-32校驗嗎的子程序。
unsigned long  crc_32_tab[256]={
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,0x0edb8832,…, 0x5a05df1b, 0x2d02ef8d
};//事先計算出的參數表,共有256項,未全部列出。


unsigned long GenerateCRC32(char xdata * DataBuf,unsigned long  len)
{
unsigned long oldcrc32;
unsigned long crc32;
unsigned long oldcrc;
unsigned  int charcnt;
        char c,t;
oldcrc32 = 0x00000000; //初值為0
    charcnt=0;
while (len--) {
                t= (oldcrc32 >> 24) & 0xFF;   //要移出的字節的值
oldcrc=crc_32_tab[t];         //根據移出的字節的值查表
                c=DataBuf[charcnt];          //新移進來的字節值
                oldcrc32= (oldcrc32 << 8) | c;   //將新移進來的字節值添在寄存器末字節中
                oldcrc32=oldcrc32^oldcrc;     //將寄存器與查出的值進行xor運算
                charcnt++;
}
        crc32=oldcrc32;
        return crc32;
}
參數表可以先在PC機上算出來,也可在程序初始化時完成。下面是用于計算參數表的c語言子程序,在Visual C++ 6.0下編譯通過。
#include <stdio.h>
unsigned long int crc32_table[256];
unsigned long int ulPolynomial = 0x04c11db7;
unsigned long int Reflect(unsigned long int ref, char ch)
{ unsigned long int value(0);
// 交換bit0和bit7,bit1和bit6,類推
for(int i = 1; i < (ch + 1); i++)
{  if(ref & 1)
   value |= 1 << (ch - i);
      ref >>= 1; }
return value;
}
init_crc32_table()
{ unsigned long int crc,temp;
// 256個值
for(int i = 0; i <= 0xFF; i++)
{   temp=Reflect(i, 8);
  crc32_table= temp<< 24;
  for (int j = 0; j < 8; j++){
      unsigned long int t1,t2;
unsigned long int flag=crc32_table&0x80000000;
   t1=(crc32_table << 1);
   if(flag==0)
     t2=0;
   else
     t2=ulPolynomial;
   crc32_table =t1^t2 ;  }
  crc=crc32_table;
  crc32_table = Reflect(crc32_table, 32);
}
}

Posted on 2005-12-14 11:14 艾凡赫 閱讀(2494) 評論(0)  編輯 收藏 引用 所屬分類: 算 法
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久不见久久见免费视频1| 日韩视频在线观看国产| 欧美亚洲日本网站| 欧美激情一二区| 欧美专区中文字幕| 亚洲免费福利视频| 日韩亚洲欧美成人| 亚洲经典在线| 国产日韩欧美精品综合| 国产精品一区二区视频| 国产精品欧美精品| 欧美午夜不卡视频| 国产精品欧美久久久久无广告| 国产精品国产馆在线真实露脸 | 开元免费观看欧美电视剧网站| 亚洲欧美亚洲| 欧美一区亚洲二区| 久久aⅴ国产紧身牛仔裤| 欧美自拍偷拍| 久久综合免费视频影院| 欧美激情1区2区| 欧美色另类天堂2015| 欧美日韩一区二区三区在线视频 | 欧美顶级大胆免费视频| 国产精品狼人久久影院观看方式| 国产综合在线看| 一本大道久久a久久综合婷婷| 欧美一级播放| 亚洲激情第一页| 亚洲自拍三区| 欧美高清视频www夜色资源网| 国产精品久久久亚洲一区| 亚洲国产精品黑人久久久| 亚洲欧美日韩人成在线播放| 亚洲国产精品一区| 久久国产精品99国产| 欧美日韩国产一级片| 在线日韩成人| 久久精品道一区二区三区| 亚洲精品日韩在线| 理论片一区二区在线| 国产日韩欧美精品一区| 亚洲午夜av电影| 亚洲理论在线| 久久国产精品99国产| 91久久亚洲| 久久久噜噜噜久久人人看| 国产精品高潮呻吟久久av黑人| 亚洲高清视频的网址| 久久高清国产| 亚洲女优在线| 欧美午夜电影网| 正在播放亚洲| 日韩视频三区| 欧美日韩专区在线| 亚洲视频高清| 日韩一区二区精品视频| 欧美—级高清免费播放| 亚洲黄一区二区| 欧美成人首页| 欧美极品在线播放| 一区二区三区日韩在线观看| 99视频热这里只有精品免费| 国产精品v日韩精品| 亚洲午夜久久久久久久久电影院| 日韩网站在线观看| 国产精品视频精品视频| 久久成人一区| 久久精品99久久香蕉国产色戒| 国产亚洲精品久久久久久| 久久久夜精品| 麻豆精品在线播放| 一个人看的www久久| 一区二区三区国产盗摄| 国产精品一区二区男女羞羞无遮挡| 小黄鸭视频精品导航| 欧美在线一二三四区| 亚洲激情成人网| 99热免费精品在线观看| 国产亚洲成av人片在线观看桃| 久久久综合激的五月天| 女人香蕉久久**毛片精品| 一区二区三区视频观看| 亚洲欧美日韩精品综合在线观看| 国产一区二区福利| 亚洲国产精品久久久久婷婷老年| 久久成人精品视频| 91久久黄色| 亚洲视频免费在线观看| 国产夜色精品一区二区av| 欧美黄色aa电影| 国产精品扒开腿爽爽爽视频| 久久综合99re88久久爱| 欧美v国产在线一区二区三区| 99精品国产99久久久久久福利| 午夜日本精品| 免费成人av在线| 亚洲自拍偷拍一区| 久热精品视频在线免费观看| 在线综合亚洲| 鲁大师成人一区二区三区| 午夜一级在线看亚洲| 免费一级欧美片在线观看| 欧美亚洲视频一区二区| 亚洲日本电影| 欧美1区2区3区| 国产精品久久久久高潮| 欧美成人精品不卡视频在线观看| 欧美三级日韩三级国产三级| 免费国产自线拍一欧美视频| 国产精品久久久久aaaa| 欧美成人资源网| 国产日韩欧美不卡在线| 日韩午夜黄色| 亚洲精品久久久久久久久久久久| 欧美亚洲视频一区二区| 亚洲在线观看免费视频| 欧美国产视频在线观看| 美日韩丰满少妇在线观看| 国产精品一区二区三区四区| 夜夜夜久久久| 亚洲一本视频| 国产精品s色| 在线视频中文亚洲| 中国成人黄色视屏| 欧美黄免费看| 亚洲国产欧美精品| 亚洲激情社区| 裸体一区二区三区| 欧美成人亚洲成人| 亚洲大胆人体视频| 久久综合久色欧美综合狠狠| 免费观看成人www动漫视频| 国产小视频国产精品| 香蕉久久精品日日躁夜夜躁| 香蕉久久夜色精品国产使用方法| 亚洲欧美在线看| 国产精品三级久久久久久电影| 99这里只有久久精品视频| 亚洲精品在线观看免费| 欧美成人在线网站| 亚洲精品久久久蜜桃| 亚洲美女毛片| 欧美日韩国产综合视频在线观看中文 | 久久免费精品视频| 国产一区二区三区不卡在线观看| 午夜激情亚洲| 久久精品人人做人人爽| 黄色精品在线看| 米奇777超碰欧美日韩亚洲| 亚洲国产高清一区| 一本久道久久综合中文字幕| 欧美日韩中文字幕在线| 香蕉成人久久| 欧美激情无毛| 亚洲一区欧美| 激情成人av在线| 欧美成人性网| 亚洲一区二区三区久久| 六月天综合网| 中文国产亚洲喷潮| 国产三级欧美三级日产三级99| 久久久久久亚洲精品杨幂换脸| 亚洲福利视频二区| 亚洲综合色自拍一区| 国产在线高清精品| 欧美激情区在线播放| 亚洲无人区一区| 久久亚洲影院| 这里只有精品丝袜| 国产日韩欧美日韩大片| 久久只有精品| 在线亚洲电影| 久久亚洲精品欧美| 亚洲一区二区三区四区在线观看| 国产美女精品免费电影| 麻豆免费精品视频| 99精品欧美一区二区三区综合在线 | 欧美sm重口味系列视频在线观看| 亚洲国产欧美一区二区三区久久 | 亚洲国产精品欧美一二99| 亚洲男人的天堂在线观看| 一色屋精品视频在线观看网站| 欧美日韩国产高清视频| 久久久999精品| 亚洲精品乱码久久久久久日本蜜臀| 在线激情影院一区| 欧美永久精品| 亚洲欧美日韩成人| 欧美成人免费全部| 国产伦精品免费视频| 免费91麻豆精品国产自产在线观看| 久久精品中文字幕一区| 一区视频在线| 欧美18av| 欧美日韩91| 亚洲黄网站在线观看| 亚洲国产美女| 亚洲乱码国产乱码精品精 | 在线天堂一区av电影|