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

📄 framer.cpp

📁 此为计算机网络课程设计C/C++源代码 包括一些协议的底层实现
💻 CPP
字号:
/*
帧封装
*/

#include<iostream>
#include<fstream>

using namespace std;

void main(int argc,char* argv[])
{
	if (argc!=3)
	{
		cout<<"usage:framer inputfile outputfile"<<endl;
		return;
	}

	fstream file;
	/*打开指定输出文件,读写方式为二进制可读可写方式,如文件存在则清楚其内容*/
	file.open(argv[2],ios::in | ios::out | ios::binary | ios::trunc);

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

	long pCrcS = file.tellp();	/*获得当前文件指针位置,计算crc时从这里开始*/

	/*写入6B目的地址*/
	char dst_addr[6]={(char)0x00,(char)0x00,(char)0xe4,(char)(0x86),(char)0x3a,(char)0xdc};

	/*写入6B源地址*/
	char src_addr[6]={(char)0x00,(char)0x00,(char)0x80,(char)0x1a,(char)0xe6,(char)0x65};

	ifstream infile;			/*创建输入文件流*/
	infile.open(argv[1],ios::binary);	/*打开指定文件*/
	infile.seekg(0,ios::end);			/*将文件指针移到末尾*/
	short length=(short)infile.tellg();	/*获得位置偏移量,即为输入文件长度*/
	
	file.put((char)length/256);
	file.put((char)length%256);			/*将该长度写入数据长度字段(2B)*/

	char *data=new char[length];
	infile.seekg(0,ios::beg);
	infile.read(data,length);			/*从输入文件中读出所有数据到data*/

	file.write(data,length);			/*将data中的数据写入输出文件*/

	infile.close();
	delete data;

	/*数据字段不足46B的部分用0填充*/
	if (length<46)
	{
		for (int i=0;i<46-length;i++)
		{
			file.put((char)0x00);
		}
	}

	/*获得当前位置,计算后的CRC码将写到这个位置*/
	long pCrc=file.tellp();

	/*数据后补1B的0,用于CRC的计算*/
	file.put((char)0x00);

	/*需要进行计算的数据的长度*/
	short total=(short)file.tellp()-(short)pCrcS;

	/*将读指针指向目的地址字段,从这里开始crc计算*/
	file.seekg(pCrcS,ios::beg);

	unsigned char crc=0;	/*初始余数为0*/
	
	while (total--)
	{
		char temp;
		file.get(temp);		/*读1B的数据*/

		/*以下模拟数据除以100000111的二进制除法过程*/
		for (unsigned char i=(unsigned char)0x80;i>0;i>>=1)
		{
			if (crc&0x80)		/*当前余数最高位为1,需要进行除法运算*/
			{
				crc<<=1;
				if (temp & i)
				{
					crc^=0x01;	/*将输入数据相应位的值递补到余数末位*/
				}
				crc^=0x07;		/*进行出发运算(即减去除数的低8位:00000111)*/
			}
			else				/*当前余数最高位为0,不需要作除法运算*/
			{
				crc<<=1;
				if (temp & i)
				{
					crc^=0x01;
				}
			}
		}
	}

	file.seekp(pCrc,ios::beg);	/*将文件指针移到数据字段后*/
	file.put(crc);				/*写入CRC码(覆盖原来补的1B0)*/

	/*
	file.seekg(0,ios::beg);
	while(!file.eof())
	{
		unsigned char temp;
		file.get(temp);
		cout<<hex<<(short)temp<<endl;
	}
	*/

	cout<<"帧文件 "<<argv[2]<<" 封装完成"<<endl;
	file.close();
	
}

⌨️ 快捷键说明

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