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

📄 加校验.cpp

📁 基于c语言实现的通信校验程序
💻 CPP
字号:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<process.h>
#include <stdlib.h>
void simpodd()				//奇校验程序
{
	char sname[10];//源文件
	int a[80];
	int i;
	printf("please input your source code file name:\n");
	scanf("%s",sname);
	
	FILE *fp;
	fp=fopen(sname,"r");
	if(fp==NULL)
	{	printf("file open error\n");
		getch();
		exit(0);
	}//打开源文件

	for(i=0 ; !feof(fp)&&i<=80;i++)
	{	
		a[i]=fgetc(fp)-'0';//将源文件内容转化后输入a数组
	  	if( a[i]!=1&&a[i]!=0&&a[i]!=-49)
		{
			printf("source data error\n");
			exit(0);
		}  //保证为10序列
	}
		
	char rname[10];//结果文件
	printf("please input your result code file name:\n");
	scanf("%s",rname);

	int t,j;
	for(j=0,t=0 ; j<i-1 ; j++) t=t+a[j];
	t=t+1;//求a数组和,加1以实现奇校验
	
	FILE *fp1;
	fp1=fopen(rname,"w");
	for(j=0 ; j<i-1 ;j++ ) fputc(a[j]+'0',fp1);//输出原码
	fputc(t%2+'0',fp1);//输出校验位
	
	fclose(fp);
	fclose(fp1);
	return;//关文件,返回

}


void verodd()				//垂直奇校验程序
{
	char sname[10];//源文件
	int a[80][10];//二维数组
	int i;
	printf("please input your source code file name:\n");
	scanf("%s",sname);
	
	FILE *fp;
	fp=fopen(sname,"r");
	if(fp==NULL)
	{	
		printf("file open error\n");
		getch();
		exit(0);
		
	}//打开文件

	for(i=0 ; !feof(fp)&&i<=800;i++)
	{	
		a[i/8][i%8]=fgetc(fp)-'0';//读文件为二维数组付值

	  	if(a[i/8][i%8]!=1&&a[i/8][i%8]!=0&&a[i/8][i%8]!=-49)
		{
			printf("source data error\n");
			exit(0);

		}  //保证为10序列
			
	}

	int k;
	i--;
	for(k=i%8 ; k<8 ; k++)
	{	
		a[i/8][k]=0;//自动补齐数据每行八个
	}		
	
	int j,t; 
	k=i/8; 
	
	for(j=0;j<=k;j++) 
	{
		t=0;
		for(i=0;i<8;i++) t=t+a[j][i];//求每一行的和
		t=t+1;//实现奇校验
		a[j][i]=t%2;//加行校验位
		a[j][9]='\n'-'0';//实现换行

	}

		
	for(j=0;j<=8;j++) 
	{
		t=0;
		for(i=0;i<=k;i++) t=t+a[i][j];//求每一列的和
		t=t+1;//实现奇校验
		a[k+1][j]=t%2;//加列校验位
	}

	
	char rname[10];
	printf("please input your result code file name:\n");
	scanf("%s",rname);//获得结果文件名

	FILE *fp1;
	fp1=fopen(rname,"w");
	for(j=0 ; j<=k+1 ;j++ )
		for(i=0;i<=9;i++) 
			fputc(a[j][i]+'0',fp1);//输出到结果文件
	
	fclose(fp);
	fclose(fp1);
	return;//关文件,返回

}

void crc()
{
	char sname[10],pname[10],rname[10];//源文件、校验码组,结果文件
	int a[128],b[40],c[80],r[40];//a源,b检验序列,c模二结果,r模二余
	int i,j,t,k;

	
	printf("please input your source code file name:\n");
	scanf("%s",sname);
	printf("please input your p(x) code file name:\n");
	scanf("%s",pname);
	printf("please input your result code file name:\n");
	scanf("%s",rname);//获取相关文件名
	

	FILE *fp1,*fp,*fp2;
	
	fp=fopen(sname,"r");
	if(fp==NULL)
	{	
		printf("file open error\n");
		getch();
		exit(0);
	}//打开文件

	fp1=fopen(pname,"r");
	if(fp1==NULL)
	{	
		printf("file open error\n");
		getch();
		exit(0);
		
	}//打开文件


	for(i=0 ; !feof(fp)&&i<=128;i++)
	{	
		a[i]=fgetc(fp)-'0';//将源文件内容转化后输入a数组
	 	if( a[i]!=1&&a[i]!=0&&a[i]!=-49)
		{
			printf("source data error\n");
			exit(0);
		} //保证为10序列
	}


	for(j=0 ; !feof(fp1)&&j<=40;j++)
	{	
		b[j]=fgetc(fp1)-'0';//将校验码文件内容转化后输入b数组
	  	if( b[j]!=1&&b[j]!=0&&b[j]!=-49 )
		{
			printf("source data error\n");
			exit(0);
		} //保证为10序列 
	}


	i--;
	j--;//计数
	
	for(t=i;t<=i+j-1;t++)
		a[t]=0;//补零
	for(k=0;k<j;k++)
		r[k]=a[k];


	for(t=0;t<=i;t++)
	{
 		if(r[0]==0)
		{
			c[t]=0;

			if(t!=i)
			{
				for(k=0;k<j-1;k++)
				r[k]=r[k+1];
			
				r[j-1]=a[t+j];
			}
		}

		

		else	
		{
			
			c[t]=1;
			for(k=0;k<j;k++)
				r[k]=(b[k]+r[k])%2;
			if(t!=i)
			{
				for(k=0;k<j-1;k++)
					r[k]=r[k+1];
				r[j-1]=a[t+j];
			}
		}
	}


	for(k=0;k<j;k++)
		a[i+k]=r[k];	


	fp2=fopen(rname,"w");

	for(k=0;k<j+i;k++)
		fputc(a[k]+'0',fp2);
		
	fclose(fp);
	fclose(fp1);
	fclose(fp2);
	return;//关文件,返回

}


void main()
{
begin:	printf("please choose error-correct way:\n");
		printf("(1)simple odd:\n");
		printf("(2)vericle odd:\n");
		printf("(3)crc test:\n");
	
		int n;
		scanf("%d",&n);
	
		switch(n)
		{
		case 1:simpodd();break;
		case 2:verodd();break;
 		case 3:crc();break;
		default:printf("wrong number.\n");goto begin;
		}

		getch();

}

⌨️ 快捷键说明

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