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