📄 framer.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 + -