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

📄 framer_1.1.cpp

📁 使用VC模拟实现帧封装功能
💻 CPP
字号:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>

void main(int argc,char*argv[])
{
	//如果输入命令行不正确,则输出提示后退出。

	if(argc!=2)
	{
		cout<<endl<<"请按以下格式输入:framer inputfile"<<endl;
		exit(0);
	}

	//打开指定的输入文件,以二进制方式打开并可读	

	ifstream infile(argv[1],ios::in|ios::binary,0); 
	int length=0;
	infile.seekg(0,ios::end);//将读指针移到文件末尾。
	length=infile.tellg();//计算指针偏移量,即为输入文件的长度。
	char title[9]="outfile";//保存输出文件名

	for(int templength=0;templength<length;templength+=1500)//每1500个字符构成一个循环
	{
		title[7]=char((templength/1500)+0x41);//构造输出文件名为:outfileA,outfileB...
		fstream file(title,ios::out|ios::in|ios::binary|ios::trunc,0); //打开输出文件

		for(int i=0;i<7;i++)
			file.put((char)0xaa);
		file.put((char)0xab);//写入7B的前导码和1B的帧前定界符。

		char des_add[]={char(0x00),char(0x00),char(0xE4),char(0x86),char(0x3A),char(0xDC)};
		file.write(des_add,6);//写入6B的目的地址。
	
		char sor_add[]={char(0x00),char(0x00),char(0x80),char(0x1A),char(0xE6),char(0x65)};
		file.write(sor_add,6);//写入6B的源地址。
	
		unsigned char data[1500];//创建字符数组。
		infile.seekg(templength,ios::beg);//将读指针移到文件指定地方。
		infile.read(data,1500);//将文件数据读入到字符指针data中。
		int number=infile.gcount();//获取实际读得的数据数

		file.put(char(number>>8));
		file.put(char(number&0xff));//将读到的数据数写入到输出文件中。
		file.write(data,number);//将data内容写入到输出文件中。

		//如果输入文件长度不足46B,则用0补足46B。

		if(number<46)
		{
			for(int j=number;j<46;j++)
				file.put(char(0x00));
		}

		file.put(char(0x00));
		file.seekg(8,ios::beg);//将读指针指向目的地址字段,从此处开始CRC计算
		unsigned char ch;//ch用来保存读入的字符。
		unsigned char crc=char(0x00);//余数初始值为0。

		while(1)//进行CRC计算
		{
			file.get(ch);
			if(ch==0xff)//判断是否到了文件结尾,如果是,则退出循环。
				break;

			for(i=0;i<8;i++)//对入读入的字符的8位分别处理。
			{
				if((crc&(0x80))==0x80)//当前余数最高位为1,需要进行除法运算。
				{
					crc=(crc<<1)&(0xff);//crc左移1位,最低位补0。
					crc=crc|((ch&0x80)>>7);//将输入数据相应的值递补到余数末位。
					crc=crc^(0x07);//进行除法运算,即与除数的低8位相异或。
				}
				else//当前余数的最高位为0,不需要进行除法运算。
				{
					crc=(crc<<1)&(0xff);//crc左移1位,最低位补0。
					crc=crc|((ch&0x80)>>7);//将输入数据相应位的值递补到余数末位。
				}
				ch=ch<<1;//读到的字符左移1位,使数据下一位作为输入位。
			}
		}

		file.clear();
		file.seekp(-1,ios::end);//将写指针移到输出文件的最后一个字节。
		file.put(crc);//写入crc码。

		file.close();//关闭输出文件
		cout<<endl<<"帧文件 "<<title<<" 封装完成"<<endl;
	}
	infile.close();//关闭输入文件
}

⌨️ 快捷键说明

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