/* 编写一个程序,能够根据输入的原始数据,及所选择的多项式,自动生成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; }
|