1. 程式人生 > >CRC迴圈冗餘校驗學習及總結

CRC迴圈冗餘校驗學習及總結

一、什麼是CRC冗餘校驗?

迴圈冗餘校驗(Cyclic Redundancy Check, CRC)是一種根據網路資料包或電腦檔案等資料產生簡短固定位數校驗碼的一種雜湊函式,主要用來檢測或校驗資料傳輸或者儲存後可能出現的錯誤。它是利用除法及餘數的原理來作錯誤偵測的。----來自百度百科 這個解釋貌似有些抽象。具體詳解會在下文詳解。

二、為什麼要有CRC冗餘校驗

先貼上一個資料幀的結構: 在資料的實際傳輸過程中資料可能會發生差錯,也就是說位元在物理鏈路中收各種影響資料會和傳送時的資料不一致,可能某個位元位在傳輸過程中會由0變為1或者相反,即實際通訊鏈路是不理想的,為了確保資料傳輸的準確性,計算機在傳輸資料時必須採用各種資料校驗機制,比如說奇偶校驗和CRC資料冗餘校驗。

三、.CRC冗餘校驗的原理是什麼?

那麼CRC迴圈冗餘校驗的原理是什麼呢,眾所周知在資料幀的最後有一個CRC校驗碼,這是CRC迴圈冗餘校驗的根本所在,那麼這個校驗碼是怎麼來的呢?其實這個校驗碼就是一個餘數,被除數是資料段的資料M左移n位(右移後空出來的位置用0填充),除數是收發雙方實現原定好的長度為k資料P,那麼大夥是不是有疑問那麼究竟源資料M要左移幾位呢n到底要為多大?其實右移的位數的大小n就是除數位數的k-1。至於為什麼請往下看。假設M為1001010,P為1101 我們實際走一下這個過程,這樣比較容易理解一點,具體步驟如下:
其實這個和我們小學學的除法區別不大,只有一點不同,注意看你源資料和除數相減時和我們十進位制除法是不一樣的,這裡用的是,模2運算就是進行加減法的時候兩個數字同為1或者同為0則結果為0不同則為1。冗餘碼就是除完以後的餘數 所以實際傳送的就是資料部分加冗餘碼即按照上面的例子就時M+冗餘碼(這裡的+不是算算數運算子),即1001010101。看到這裡你是不是就明白了為什麼冗餘碼的長度是除數的長度減一了吧。 那麼接收端接收到資料以後怎麼驗證自己收到的資料是不是正確無誤的呢,接收端拿到資料以後就直接用資料連上校驗碼除以已知的除數如果餘數位0則資料正確,如果餘數不為0則判定該則該幀有誤,就丟棄,要注意的是判斷只能判斷幀是否正確但不能判斷幀出錯幾位或者說在哪個位置出錯。 看到這你是不是就理解了CRC迴圈冗餘校驗呢,不理解的話就評論吧,我們在評論中交流一下。 如果文中有什麼錯誤,歡迎大家指出。謝謝!