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

📄 codeerrordetecting.cpp

📁 海明码和CRC校验码加密和捡错程序 c编写
💻 CPP
字号:
#include<iostream>
#include<math.h>
#include<string.h>
#include<time.h>
using namespace std;
const int N=100;                 //编码最大允许长度
int source[N]={0},hm[N]={0},crc[N]={0},g[N]={0};
char s[N];


int Comp_Length(int a)         //求海明码的长度r
{
	for(int i=1;;i++)
		if(a+i+1<=pow(2,i))
			return i;
}

int Insert(int a,int m)       //在原数字序列中插入海明码
{
	int i;
	/*for(i=0;i<m;i++)   
		cout<<source[i];
	cout<<"\t";*/
	for(i=m-1;i>=a-1;i--)
		source[i+1]=source[i];
	source[a-1]=2;
	/*for(i=0;i<m;i++)   
		cout<<source[i];
	cout<<endl;*/
	return m+1;
}

void HmCreate(int r,int m)    //生成海明码
{
	int i,j,l,temp[N];
	for(i=0;i<r;i++)     //初始化hm
		hm[i]=0;
	for(i=0;i<m;i++)
		if(source[i]==1)
		{
			l=r-1;
			j=i+1;
			do              //将下标转化为二进制数
			{
				temp[l--]=j%2;
				j=j/2;
			}while(j);
			/*for(;l>=0;l--)
				temp[l]=0;
			for(l=0;l<r;l++)   
				cout<<temp[l];
			cout<<"\t";*/
			for(l=0;l<r;l++)
				hm[l]=(hm[l]+temp[l])%2;
		}
		//cout<<endl;
}

int Convert(int r,int m)     //确定出错的比特位
{
	int i,result=0;
  	for(i=0;i<r;i++)
		result+=hm[i]*pow(2,r-i-1);
	return result;
}

void Haiming(int m)        //海明码纠错主程序
{
	int i,r,label;
	for(i=0;i<N&&source[i]!=2;i++)
		r=Comp_Length(m);
	for(i=0;i<=r-1;i++)
		m=Insert(pow(2,i),m);
	HmCreate(r,m);
	/*for(i=0;i<r;i++)   
		cout<<hm[i];
	cout<<endl;
	for(i=0;i<m;i++)   
		cout<<source[i];
	cout<<endl;*/
	for(i=0;i<r;i++)
	{
		int j=pow(2,r-i-1)-1;
		source[j]=hm[i];
	}
	cout<<"海明编码后发送的信息为:\n";
	for(i=0;i<m;i++)   
		cout<<source[i];
	cout<<endl;
	for(i=0;i<3000000;i++)  //显示格式
		if(i%100000==0)
			cout<<".";
	cout<<"数据传送中";
	for(i=0;i<3000000;i++)
		if(i%100000==0)
			cout<<".";
	cout<<endl;
	srand(time(NULL));
	label=rand()%(m+1);
	if(label!=m)
		source[label]=(source[label]+1)%2;
	cout<<"收到信息为:\n";
    for(i=0;i<m;i++)   
		cout<<source[i];
	cout<<endl;
	HmCreate(r,m);
	if(Convert(r,m))
		cout<<"第"<<Convert(r,m)<<"位传送出错\n";
	else 
		cout<<"传输正确\n";
}

int Find(int temp[N],int m)         //返回被减数中第一个不为0的比特位的下标
{
	int i;
	for(i=0;i<m;i++)
		if(temp[i])
			break;
    return i;
}

void CRCCreate(int m,int G)         //生成CRC码检错主程序
{
    int j,i;
   	j=0;
	for(i=0;i<m;i++)
		crc[i]=source[i];
	while(m-j>=G)
	{
		for(i=0;i<G;i++)
		{
			crc[j]=(crc[j]+g[i])%2;
			j=j+1;
		}
		j=Find(crc,m);
		//cout<<j;
	}
} 


void CRC(int m)                  //CRC码检错主程序  
{
	int option,i,label,G;
	cout<<"请选择CRC码位数,1代表8位,2代表12位,3代表16位:\n";
	cin>>option;
	switch(option)
	{
		case 1:
			G=9;
			for(i=0;i<G;i++)
				if(i==0||i==6||i==7||i==8)
					g[i]=1;
		break;
		case 2:
			G=13;
			for(i=0;i<G;i++)
				if(i==0||i==1||i==9||i==10||i==11||i==12)
					g[i]=1;
		break;
		case 3:
			G=17;
			for(i=0;i<G;i++)
				if(i==0||i==1||i==14||i==16)
					g[i]=1;
			break;
	}
	m=m+G;
	/*for(i=0;i<m;i++)   
		cout<<crc[i];
	cout<<endl;*/
	CRCCreate(m,G);
	for(i=0;i<m;i++)
		source[i]=crc[i]+source[i];
	cout<<"CRC编码后发送的信息为:\n";
	for(i=0;i<m;i++)   
		cout<<source[i];
	cout<<endl;
	for(i=0;i<3000000;i++)  //显示格式
		if(i%100000==0)
			cout<<".";
	cout<<"数据传送中";
	for(i=0;i<3000000;i++)
		if(i%100000==0)
			cout<<".";
	cout<<endl;
	srand(time(NULL));
	label=rand()%(m+1);
	if(label!=m)
		source[label]=(source[label]+1)%2;
	cout<<"收到信息为:\n";
	CRCCreate(m,G);
	for(i=0;i<m;i++)   
		cout<<source[i];
	cout<<endl;
	for(i=0;i<m;i++)   
		if(crc[i])
		{
			cout<<"传输出错\n";
			break;
		}
	if(i==m)
		cout<<"传输正确\n";
}




int main()
{
    int i,m,option;
	for(i=0;i<N;i++)   //初始化
		s[i]='*';
	cout<<"请输入待发送信息:\n";
	gets(s);//从屏幕获取数字序列
	for(i=0;i<N&&s[i]!='\0';i++)
        source[i]=s[i]-48;
	m=i;
	cout<<"请选择编码方式,1代表CRC编码,2代表Haiming编码:\n";
	cin>>option;
	if(option==1)
		CRC(m);
	else
		Haiming(m);
	return 0;
}

⌨️ 快捷键说明

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