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)
#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;
}