【計算機網路實驗】迴圈冗餘檢驗CRC
阿新 • • 發佈:2019-01-31
CRC的基本思想:
將二進位制位串看成係數為0或1的多項式。使用CRC編碼時,傳送方和接收方必須事先商定一個生成多項式G(x),生成多項式的最高位和最低位的係數必須是1。
假設一個幀有m位,對應的多項式為M(x),為了計算它的校驗和,該幀必須比生成多項式長。
CRC的原理:
在幀的尾部追加一個校驗和,使得追加之後的幀所對應的多項式能夠被G(x)整除。
當接收方收到了帶校驗和的幀後,用G(x)去除它,如果有餘數,則表示傳輸過程中有錯誤。
計算CRC校驗和的演算法:
① 假設G(x)的階為r。在幀的尾部加上r個0,構成的幀包含m+r位,對應的多項式為x^r*M(x);
② 利用模2做除法。用G(x)去除x^r*M(x),得x^r*M(x) /G(x) = Q(x) + R(x)/G(x) ,其中Q(x)為商,R(x)為餘數。
③ 利用模2做減法。用x^r*M(x)減去餘數R(x),結果就是將要被傳輸的帶校驗和的幀,記為T(x)= x^r*M(x) – R(x)。
例如:
設M(x) = 101001,除數 G(x) = 1101,則m=6,r=3。
則被除數是 x^r*M(x) = 101001000。
模2運算的結果是:商Q = 110101,餘數R = 001。
把餘數R作為冗餘碼新增在資料M的後面傳送出去。傳送的資料是:x^r*M(x) + R ,即101001001,共(m + r)位。
輸入為兩行。
第一行輸入M位二進位制,表示待發送的資料。(M<=100)
第二行輸入R+1位二進位制,表示生成多項式的係數。(R<=32)
輸出描述:在一行中輸出加上FCS後傳送的資料。輸入樣例:1010011101輸出樣例101001001#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<string> #include<sstream> #include<algorithm> using namespace std; int main() { string s1, s2; string s3, s4; cin >> s1 >> s2; int l2 = s2.size(); int l1 = s1.size(); cout << s1; for(int i = 0; i < l2 - 1; i++) { s1 += '0'; } s4 = s1; int flag,k; for(int i = 0; i <= (l1-1); i++) { k = 0; flag = i; for(int j = i; j < (l2+i); j++) { //cout << "flag " << flag <<endl; if(s1[flag] == '0') { break; } else { flag = -1; if(s1[j] != s2[k]) { s1[j] = '1'; } else s1[j] = '0'; k++; //cout << "j " << j <<endl; } } //cout << s1 << endl; } for(int i = l1; i < l1+l2-1; i++) { s3 += s1[i]; } //cout << s3 <<endl; cout << s3 << endl; return 0; }