1. 程式人生 > >【計算機網路實驗】迴圈冗餘檢驗CRC

【計算機網路實驗】迴圈冗餘檢驗CRC

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)位。

程式設計實現:使用迴圈冗餘檢驗CRC計算幀檢驗序列FCS,並輸出傳送的幀。 輸入描述

輸入為兩行。

第一行輸入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;
}