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

📄 framer.cpp

📁 以太网祯封装程序
💻 CPP
字号:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
	int i,j,t,k;
	char order[120];//存储输入的命令行
	char framer[40];//存储输入的命令段
	char filename1[40];//存储输入的源文件名
	char filename2[40];//存储输入的目的文件名
	unsigned char CRC;
	void *buf;
	unsigned char *buffer;
	//	clrscr();
	while(1)
	{
		printf("Input the order:('exit' to quit)\n\n");
		printf(">>:");
		gets(order);
		if(strcmp(order,"exit")==0)
			exit(0);
		t=0;
		for(i=0;(order[i]!=' ')&&(order[i]!=0);i++)
			framer[t++]=order[i];
		framer[t]=0;
		while(order[t]==' ')t++;
		k=0;
		for(i=t;order[i]!=' ';i++)
			filename1[k++]=order[i];
		filename1[k]=0;
		t=0;
		while(order[i]==' ')i++;//去掉命令行中间的空格
		for(j=i;order[j]!=0;j++)
			filename2[t++]=order[j];
		filename2[t]=0;
		puts(framer);
		puts(filename1);
		puts(filename2);
		if(strcmp(framer,"framer")==0)
		{
			FILE *fp,*fp1;
			if((fp=fopen(filename1,"rb"))==NULL)
			{
				printf("Open inputfile error!\n");
				continue;//打开源文件错误
			}
			if((fp1=fopen(filename2,"wb+"))==NULL)
			{
				printf("Open outputfile error!\n");
				continue;//打开目的文件错误
			}
			printf("Open file success!\n\n");
			fseek(fp,0,2);
			int inputsize=ftell(fp);
			printf("the size of the inputfile is:%4d\n\n",inputsize);
			if(inputsize<46)
			{
				buf=malloc(46);//数据段长度小于46字节
			}
			else if(inputsize>1500)
			{
				printf("The size of the data is to lage(46-1500)\n\n");
				continue;
			}
			else
				buf=malloc(inputsize);
			rewind(fp);
			char ch;
			ch=0xAA;
			for(i=0;i<7;i++)
				fprintf(fp1,"%c",ch);//写入前导码
			ch=0xAB;
			fprintf(fp1,"%c",ch);//写入定界符
			char sh[6]={0x00,0x00,0xE4,0x86,0x3A,0xDC};
			for(i=0;i<6;i++)
				fprintf(fp1,"%c",sh[i]);
			char sh1[6]={0x00,0x00,0x80,0x1A,0xE6,0x65};
			for(i=0;i<6;i++)
				fprintf(fp1,"%c",sh1[i]);//写入目的地址和源地址
			fwrite(&inputsize,2,1,fp1);//写入数据段大小
			rewind(fp);
			fread(buf,inputsize,1,fp);
			fwrite(buf,inputsize,1,fp1);
			if(inputsize<46)
			{
				for(i=inputsize;i<46;i++)
					fprintf(fp1,"%c",0x00);
			}//如果数据段长度小于46字节,填充0

			fseek(fp1,0,2);
			int outputsize=ftell(fp1);
			buffer=(unsigned char*)malloc(outputsize+1);
			rewind(fp1);
			fread(buffer,1,outputsize,fp1);
			buffer[outputsize]=0x00;
			CRC=0x00;//用CRC代表寄存器中的值进行移位操作
			for(i=8;i<=outputsize;i++)//从目的地址开始计算
			{
				for(j=7;j>=0;j--)
				{
					int in=(buffer[i]>>j)&0x01;//输入位是否为1
					int a=(CRC>=0x80);//寄存器头位是否为1
					if(a)
					{
						CRC=CRC^0x03;
						CRC=CRC<<1;
						if(!in)
							CRC+=0x01;
					}
					if(!a)
					{
						CRC=CRC<<1;
						if(in)
							CRC+=0x01;
					}
				}
			}//生成CRC校验码。

			printf("CRC=%02XH\n\n",CRC);
			fseek(fp1,0,2);
			fprintf(fp1,"%c",CRC);
			delete(buf);
			delete(buffer);
			fclose(fp);
			fclose(fp1);
		}
	}
}

⌨️ 快捷键说明

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