/*
编写一个程序,能够根据输入的原始数据,及所选择的多项式,自动生成CRC校验码。
算法参考:https://www.bilibili.com/video/BV1V4411Z7VA
建议根据上面的链接自己敲一遍,再对比我的代码,一起学习。
*/
#define N 50
#include<string>
#include<vector>
#include <algorithm>
#include<iostream>
using namespace std;
int arr[N];//存放为1的数
static int cot = 0;//指针偏移
void numFun(char num) //遍历多项式系数标记系数为1的数
{
if ('1'==num)
{
arr[cot] = 1;
}
cot++;
}
int main()
{
string rawData;//原始数据
string num;//系数
cout << "请输入原始数据:" << endl;
cin >> rawData;
cout << "请输入多项式的各项系数:" << endl;
cin >> num;
rawData.append(num.size()-1,'0');
string::iterator ite=num.end();
string::iterator ite0 = num.begin();
for_each(ite0+1, ite,numFun);
vector<char>vec(num.size(),'\0');//容器
vector<char>::iterator ite1 = vec.end()-1;
vector<char>::iterator ite2 = vec.begin();
for (size_t i=0;i<vec.size();i++) //容器初始化
{
*ite2 = rawData[i];
ite2++;
}
for (size_t i=0;i<rawData.size()-vec.size();i++) //求CRC校验码
{
ite2 = vec.begin();
if ('1'==*ite2)
{
for (int i=0;i<cot;i++)
{
if(1==arr[i])
{
if ('1'==vec[i+1])
{
vec[i + 1] = '0';
}
else if ('0'==vec[i+1])
{
vec[i + 1] = '1';
}
}
}
}
for (size_t i=0;i<vec.size()-1;i++)
{
vec[i] = vec[i + 1];
}
*ite1 = rawData[vec.size()+i];
}
cout << "CRC校验码为:" << endl;
for (size_t i=1;i<vec.size();i++)
{
cout << vec[i];
}
system("pause");
return 0;
}