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

📄 framer.cpp

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

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

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

	//打开指定的输出文件,以二进制方式打开并可读可写,如文件存在,则清除其内容。
	
	fstream file(argv[2],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的源地址。

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

	ifstream infile(argv[1],ios::in|ios::binary,0); 

	int length=0;
	infile.seekg(0,ios::end);//将读指针移到文件末尾。
	length=infile.tellg();//计算指针偏移量,即为输入文件的长度。
	unsigned char* data=new unsigned char[length];//创建字符指针并根据文件长度初始化。
	infile.seekg(0,ios::beg);//将读指针移到文件开始。
	infile.read(data,length);//将文件数据读入到字符指针data中。

	file.put(char(length>>8));
	file.put(char(length&0xff));//将文件长度写入到输出文件中。
	file.write(data,length);//将data内容写入到输出文件中。

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

	if(length<46)
	{
		for(int j=length;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();
	infile.close();//关闭输入文件和输出文件。

	cout<<endl<<"帧文件 "<<argv[2]<<" 封装完成"<<endl;
}

⌨️ 快捷键说明

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