⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crccheckout_c++.cpp

📁 本程序是一个用纯C++编写的CRC校验程序
💻 CPP
字号:
#include<iostream.h>
#include<string.h>
char gx[5]={'1','1','0','0','1'};     //gx[5]中存放的是生成多项式
class CRC{
private:	
    char fx[81];                      //fx[81]中存放的是要发送的比特序列
public:
	CRC(){
		cin>>fx;
	}
	char* calculate_rest(char* mesg);
	void sender();
    void interfere();
	bool receiver();
};
char* CRC::calculate_rest(char* mesg)             //crc_rest函数求余数并返回所求得的余数
{                                      //mesg用来接收比特序列
	int len=strlen(mesg),i=0,j,k,m;    //len表示接收到的比特序列的长度
	char* rest=new char[5];            //rest中存放余数
                                       //do{}while();语句求经过处理后比特序列的余数	
	while(i<len-4){
		while(mesg[i]=='0')i++;
		k=i;                           //i指示比特序列的第一个一的位置,k暂时记下i的值
		for(j=0;j<5;j++){              //j控制异或运算的次数
			if(mesg[k]!=gx[j])mesg[k]='1';
			else mesg[k]='0';
			k++;
		}
		i++;							
	}

	for(m=0,i=len-4;i<len&&m<4;i++,m++)
		rest[m]=mesg[i];
	rest[4]='\0';

	return rest;
}

void CRC::sender()                     //send()函数完成两件事:
{                                      //1、将要发送的比特序列左移 4 位
	int i,len=strlen(fx);              //2、生成带crc校验的比特序列                                                                                                                                                                                                                                                           
	char* temp=new char[len+5];        //temp用来暂时存放message中的比特序列
	char* rest=new char[5];            //rest用来存放余数
	char* atemp=new char[5];           //atemp用来暂时存放四个“0”

	strcpy(temp,fx);

	for(i=0;i<4;i++)
		atemp[i]='0';
	atemp[4]='\0';

    strcat(temp,atemp);
	delete []atemp;

	rest=calculate_rest(temp);
    rest[4]='\0';
    delete []temp;

	cout<<"将要发送的比特序列的余数是:";
	for(i=0;rest[i]=='0'&&i<4;i++);
	if(i==4)
		cout<<'0'<<endl;
	else 
		for(i;i<4;i++)
			cout<<rest[i];
		cout<<endl;
			
	strcat(fx,rest);
	cout<<"这是带CRC校验的比特序列:"<<fx<<endl;
	delete []rest;
}


void CRC::interfere()                  //interfere()函数完成对带crc校验的比特序列的干扰
{                                      //并返回干扰后的比特序列
	int num;                           //num接收主函数传来的干扰位
	cout<<"请输入干扰信号(即干扰第几位),所输的数大于 1 并小于 "
		<<strlen(fx)<<"有效:";
	cin>>num;
	cout<<endl;

	if(fx[num]=='1')                 
		fx[num]='0';                 
	else
		if(fx[num]=='0')
			fx[num]='1';
	cout<<"这是经过干扰后比特序列:"
		<<fx<<endl;
}

bool CRC::receiver()                   //判断接收到的比特序列余数是不是“0”,
{                                      //若是则返回1,若不是则返回0
	char* rest=new char[5];            //rest用来存放余数          
	rest=calculate_rest(fx);
	rest[4]='\0';

	cout<<"经过干扰后的比特序列的余数是:";
	for(int i=0;rest[i]=='0'&&i<4;i++);
	if(i==4)
		cout<<'0'<<endl;
	else 
		for(i;i<4;i++)
			cout<<rest[i];
		cout<<endl<<endl;

	for(i=0;i<4;i++)
		if(rest[i]!='0'){
			delete []rest;
			return false;
		}
	delete []rest;
    return true;	 
}

void main()
{
    cout<<"请输入要发送的比特序列(0 或1):";
	CRC object;
	cout<<endl;

    object.sender();
	cout<<endl;

	object.interfere();
       
	if(object.receiver())
		cout<<"您所输入的干扰无效,发送成功!"<<endl;
	else 
		cout<<"您所输入的干扰有效,发送失败!"<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -