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

编程思路

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

实验过程(具体代码)

#include <iostream>
#include<vector>
#include<string>
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");
}

测试结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试结果正确。
PS:我写的应该不算简洁,有同学三十多行就搞定了qaq

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值