CRC循环冗余检验的C++实现

编程思路

借助vector进行运算,vector中每一个元素一次代表被除数的一位数,随运算过程,下标改变,直至全部计算完。所谓的“除”,是借助二进制数的异或运算实现的。最后实现的用户效果是,任意输入待发送数据和除数,即可得到相应冗余码。

实验过程(具体代码)

#include 
#include
#include
using namespace std;
//循环冗余检验(CRC)
void main()
{
	vector<int> number;     //用于存储被除数,vector中每一个元素一次代表一位数
	string s,p,q,r;     //s为待传输的数据,p为除数,q为每一轮与p进行异或运算的数,r为余数(即冗余码)
	cout <<"请输入待发送的数据:";
	cin >> s;
	int i,sign,z,x;
	for ( i = 0; i < s.length(); i++)     //先存入待传输的数
	{
		number.push_back(s[i]-'0');
	}
	cout << "请输入除数:";
	cin >> p;
	q = p;
	r = p;
	for (i = 1; i < p.length(); i++)     //再根据除数位数在后面添0得到被除数
	{
		number.push_back(0);
	}
	for (i = 0; i < p.length(); i++)
	{
		q[i] = char(number[i]+'0');
	}
	sign = p.length();     //sign为记录被除数操作到哪一位的标志数
	while (sign < number.size()+1)
	{
		for (i = 0; i < p.length(); i++)     //异或运算
		{
			r[i] = char(((p[i]-'0')^(q[i]-'0'))+'0');
		}
		z = 0;
		for (i = 0; i < r.length(); i++)
		{
			if (r[i] == '0')
				z++;
			else
				break;
		}
		if (sign == number.size())
			break;
		x = number.size() - sign;
		if (x < z)
		{
			for (i = 0; i < r.length()-z; i++)
			{
				r[z - x + i] = r[z + i];
			}
			for (i = 0; i < x; i++)
			{
				r[r.length()-x+i] = char(number[sign++]+'0');
			}
			break;
		}
		for (i = 0; i < r.length() - z; i++)
		{
			q[i] = r[z+i];
		}
		for (i = 0; i < z; i++)
		{
			q[r.length()-z+i] = char(number[sign++] + '0');
		}
	}
	cout << "冗余码为:";
	for (i = 1; i < r.length(); i++)
	{
		cout << r[i];
	}
	cout << endl;
	system("pause");
}

测试结果
CRC循环冗余检验的C++实现_第1张图片
在这里插入图片描述
在这里插入图片描述
测试结果正确。
PS:我写的应该不算简洁,有同学三十多行就搞定了qaq

你可能感兴趣的:(CRC循环冗余检验的C++实现)