1. crc校驗原理
crc校驗原理看起來比較複雜,好難懂,因為大多數書上基本上是以二進位制的多項式形式來說明的。其實很簡單的問題,其根本思想就是先在要傳送的幀後面附加乙個數(這個就是用來校驗的校驗碼,但要注意,這裡的數也是二進位制序列的,下同),生成乙個新幀傳送給接收端。當然,這個附加的數不是隨意的,它要使所生成的新幀能與傳送端和接收端共同選定的某個特定數整除(注意,這裡不是直接採用二進位制除法,而是採用一種稱之為「模2除法」)。到達接收端後,再把接收到的新幀除以(同樣採用「模2除法」)這個選定的除數。因為在傳送端傳送資料幀之前就已通過附加乙個數,做了「去餘」處理(也就已經能整除了),所以結果應該是沒有餘數。如果有餘數,則表明該幀在傳輸過程中出現了差錯。
【說明】「模2除法」與「算術除法」類似,但它既不向上位借位,也不比較除數和被除數的相同位數值的大小,只要以相同位數進行相除即可。模2加法運算為:1+1=0
,0+1=1,0+0=0,無進製,也無借位;模2減法運算為:1-1=0
,0-1=1,1-0=1,0-0=0,也無進製,無借位。相當於二進位制中的邏輯異或運算。也就是比較後,兩者對應位相同則結果為「0」,不同則結果為「1」。如100101除以1110,結果得到商為11,餘數為1,如圖5-9左圖所示。如11×11=101,如圖5-9右圖所示。
圖5-9 「模2除法」和「模2乘法」示例
具體來說,crc校驗原理就是以下幾個步驟:
(1)先選擇(可以隨機選擇,也可按標準選擇,具體在後面介紹)乙個用於在接收端進行校驗時,對接收的幀進行除法運算的除數(是二進位制比較特串,通常是以多項方式表示,所以crc又稱多項式編碼方法,這個多項式也稱之為「生成多項式」)。
(2)看所選定的除數二進位制位數(假設為k位),然後在要傳送的資料幀(假設為m位)後面加上k-1位「0」,然後以這個加了k-1個「0「的新幀(一共是m+k-1位)以「模2除法」方式除以上面這個除數,所得到的餘數(也是二進位制的位元串)就是該幀的crc校驗碼,也稱之為fcs(幀校驗序列)。但要注意的是,餘數的位數一定要是比除數字數只能少一位,哪怕前面位是0,甚至是全為0(附帶好整除時)也都不能省略。
(3)再把這個校驗碼附加在原資料幀(就是m位的幀,注意不是在後面形成的m+k-1位的幀)後面,構建乙個新幀傳送到接收端,最後在接收端再把這個新幀以「模2除法」方式除以前面選擇的除數,如果沒有餘數,則表明該幀在傳輸過程中沒出錯,否則出現了差錯。
通過以上介紹,大家一定可以理解crc校驗的原理,並且不再認為很複雜吧。
從上面可以看出,crc校驗中有兩個關鍵點:一是要預先確定乙個傳送端和接收端都用來作為除數的二進位制位元串(或多項式);二是把原始幀與上面選定的除進行二進位制除法運算,計算出fcs。前者可以隨機選擇,也可按國際上通行的標準選擇,但最高位和最低位必須均為「1」,如在ibm的sdlc(同步資料鏈路控制)規程中使用的crc-16(也就是這個除數一共是17位)生成多項式g(x)= x
16 + x
15 + x
2 +1(對應二進位制位元串為:11000000000000101);而在iso hdlc(高階資料鏈路控制)規程、itu的sdlc、x.25、v.34、v.41、v.42等中使用ccitt-16生成多項式g(x)=x
16 + x
15 + x
5 +1(對應二進位制位元串為:11000000000100001)。
2. crc校驗碼的計算示例
由以上分析可知,既然除數是隨機,或者按標準選定的,所以crc校驗的關鍵是如何求出餘數,也就是crc校驗碼。
下面以乙個例子來具體說明整個過程。現假設選擇的crc生成多項式為g(x) = x4 + x3 + 1,要求出二進位制序列10110011的crc校驗碼。下面是具體的計算過程:
(1)首先把生成多項式轉換成二進位制數,由g(x) = x4 + x3 + 1可以知道(,它一共是5位(總位數等於最高位的冪次加1,即4+1=5),然後根據多項式各項的含義(多項式只列出二進位制值為1的位,也就是這個二進位制的第4位、第3位、第0位的二進位制均為1,其它位均為0)很快就可得到它的二進位制位元串為11001。 (
2)因為生成多項式的位數為
5,根據前面的介紹,得知
crc校驗碼的位數為
4(校驗碼的位數比生成多項式的位數少
1)。因為原資料幀
10110011
,在它後面再加4個
0,得到
101100110000
,然後把這個數以「模
2除法」方式除以生成多項式,得到的餘數,即crc校驗碼為
0100,如圖
5-10
所示。注意參考前面介紹的「模
2除法」運算法則。
圖5-10 crc校驗碼計算示例 (
3)把上步計算得到的
crc校驗碼
0100
替換原始幀
101100110000
後面的四個「
0」,得到新幀
101100110100
。再把這個新幀傳送到接收端。
(4)當以上新幀到達接收端後,接收端會把這個新幀再用上面選定的除數11001以「模2除法」方式去除,驗證餘數是否為0,如果為0,則證明該幀資料在傳輸過程中沒有出現差錯,否則出現了差錯。
通過以上crc校驗原理的剖析和crc校驗碼的計算示例的介紹,大家應該對這種看似很複雜的crc校驗原理和計算方法應該比較清楚了。
下面大家做乙個練習,假設crc生成多項式為g(x) = x5 + x4 +x+1,要傳送的二進位制序列為100101110,求crc校驗碼是多少。
海明碼校驗(通俗易懂)
管你以前會不會,看完都變會。哈哈哈哈哈 首先要了解一下,海明碼由校驗碼和題目給出的原資料組合而成。例如 用偶校驗方式的海明碼校驗資料01101001 1.第一步 確定校驗碼的位數k 2.第二步 確定校驗碼以及原資料的位置h1 p1h2 p2h3 h4p3 h5h6 h7h8 p3h9 h10h11 ...
numpy bincount 通俗易懂
bincount的用途很簡單,就是統計出乙個列表的各個元素的出現次數。例如輸入是 1,0,2,2,1,2,3,5 那麼輸出就是 1,2,3,1,0,1 這樣的結果可能並不是很直觀,可能依然會有同學會問為什麼會輸出這樣的結果。我們看看 假如我們把輸入的列表中的數字都統計一遍,形成乙個字典 key是列表...
通俗易懂的C STL
泛型程式設計 generic programming 是一種語言機制,通過它可以實現乙個標準的容器庫。像類一樣,泛型也是一種抽象資料型別,但是泛型不屬於物件導向,它是物件導向的補充和發展。泛型程式設計在c 上的應用主要體現在兩方面 函式模板和類模板。接下來舉個栗子 csdn部落格 anyway,模板...