#include<iostream.h>
#include<fstream.h>
void main (int argc,char* argv[])
{
if(argc!=3)//判断输入的命令行格式是否正确
{
cout<<"请按以下格式输入命令行: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时从这里开始
char dst_addr[6]={char(0x00),char(0x00),char(0xe4),char(0x86),char(0x3a),
char(0xdc)};
file.write(dst_addr,sizeof(dst_addr));
//写入6B目的地址
char src_addr[6]={char(0x00),char(0x00),char(0x80),char(0x1a),char(0xe6),
char(0x65)};
file.write(src_addr,sizeof(src_addr));
//写入6B源地址
ifstream infile;//创建输入文件流
infile.open(argv[1],ios::binary);//打开指定输入文件
infile.seekg(0,ios::end);//将文件读指针移到末尾
short length=(short)infile.tellg();//获得位置偏移量,即为输入文件长度
file.put(char(length/256));//将该长度写入数据长度字段(2B)
file.put(char(length%256));
char* data=new char[length];
infile.seekg(0,ios::beg);
infile.read(data,length);//从输入文件中读出所有数据至data中
file.write(data,length);//将data中数据写入输出文件
infile.close();//关闭输入文件
delete data;//回收data
if(length<46) for(int i=0;i<46-length;i++) file.put(char(0x00));
//数据字段不足46B的部分用0填充
long pCrc=file.tellp();
//获得当前位置,计算后的CRC码将写到这个位置
file.put(char(0x00));
//数据部分补1B的0,用于CRC计算
short total=short(file.tellp())-(short)pCrcs;
//需要进行计算的数据长度
file.seekg(pCrcs,ios::beg);
//将读指针指向目的地址字段,从这里开始crc计算
unsigned char crc=0; //初始余数为0
while(total--)
{
unsigned char temp;
file.get(temp); //读1B的数据
//以下模拟数据除以100000111的二进制除法过程
for(unsigned char i=(unsigned char)0x80;i>0;i>>=1)
{
if(crc&0x80)
{
crc<<=1;
if(temp&i) crc^=0x01;
//将输入数据相应位的值递补到余数末位
crc^=0x07;
//进行除法运算(即减去除数的低8位:00000111)
}
else
{
crc<<=1;
if(temp&i) crc^=0x01;
//将输入数据相应位的值递补到余数末位
}
}
}
file.seekp(pCrc,ios::beg);
file.put(crc);
/*file.seekg(0,ios::beg);
while(!file.eof())
{
unsigend char temp;
file.get(temp);
cout<<hex<<(short)temp<<endl;
}*/
cout<<"帧文件"<<argv[2]<<"封装完成"<<endl;
file.close(); //关闭文件
}