资源简介

完整的C++代码,VC编译后生成FrameParser.exe,然后在cmd运行解析FrameParser.exe input;

资源截图

代码片段和文件信息

#include			// 用于文件操作
#include // 用于程序流程控制


////////////////////////////////////////////////////////////////////////////////
// CRC校验,在上一轮校验的基础上继续作8位CRC校验
// 
// 输入参数:
// chCurrByte 低8位数据有效,记录了上一次CRC校验的余数
// chNextByte 低8位数据有效,记录了本次要继续校验的一个字节
//
// 传出参数:
// chCurrByte 低8位数据有效,记录了本次CRC校验的余数
////////////////////////////////////////////////////////////////////////////////

void checkCRC(int &chCurrByte int chNextByte)
{
// CRC循环:每次调用进行8次循环,处理一个字节的数据。
for (int nMask = 0x80; nMask > 0; nMask >>= 1)
{
if ((chCurrByte & 0x80) != 0) // 首位为1:移位,并进行异或运算
{
chCurrByte <<= 1; // 移一位
if ( (chNextByte & nMask) != 0) // 补一位
{
chCurrByte |= 1;
}
chCurrByte ^= 7; // 首位已经移出,仅对低8位进行异或运算,7的二进制为00000111
}
else // 首位为0,只移位,不进行异或运算
{
chCurrByte <<= 1; // 移一位
if ( (chNextByte & nMask) != 0) // 补一位
{
chCurrByte |= 1;
}
}
}
}


void main(int argc char* argv[])
{
// 检测命令行参数的正确性
if (argc != 2)
{
cout << “请以帧封装包文件为参数重新执行程序“ << endl;
exit(0);
}

// 检测输入文件是否存在,并可以按所需的权限和方式打开
ifstream file(argv[1] ios::in|ios::binary|ios::nocreate);
if (!file.is_open())
{
cout << “无法打开帧封装包文件,请检查文件是否存在并且未损坏“ << endl;
exit(0);
}


// 变量声明及初始化
int nSN = 1; // 帧序号
int nCheck = 0; // 校验码
int nCurrDataOffset = 22; // 帧头偏移量
int nCurrDataLength = 0; // 数据字段长度
bool bParseCont = true; // 是否继续对输入文件进行解析
int nFileEnd = 0; // 输入文件的长度

// 计算输入文件的长度
file.seekg(0 ios::end); // 把文件指针移到文件的末尾
nFileEnd = file.tellg(); // 取得输入文件的长度
file.seekg(0 ios::beg); // 文件指针位置初始化

cout.fill(‘0‘); // 显示初始化
cout.setf(ios::uppercase); // 以大写字母输出

// 定位到输入文件中的第一个有效帧
// 从文件头开始,找到第一个连续的“AA-AA-AA-AA-AA-AA-AA-AB”
while ( true )
{
for (int j = 0; j < 7; j++) // 找7个连续的0xaa
{
if (file.tellg() >= nFileEnd) // 安全性检测
{
cout<<“没有找到合法的帧“< file.close();
exit(0);
}
// 看当前字符是不是0xaa,如果不是,则重新寻找7个连续的0xaa
if (file.get() != 0xaa)
{
j = -1;
}
}

if (file.tellg() >= nFileEnd) // 安全性检测
{
cout<<“没有找到合法的帧“< file.close();
exit(0);
}

if (file.get() == 0xab) // 判断7个连续的0xaa之后是否为0xab
{
break;
}
}

// 将数据字段偏移量定位在上述二进制串之后14字节处,并准备进入解析阶段
nCurrDataOffset = file.tellg() + 14;
file.seekg(-8ios::cur);


// 主控循环
while ( bParseCont ) // 当仍然可以继续解析输入文件时继续解析
{

// 检测剩余文件是否可能包含完整帧头
if (file.tellg() + 14 > nFileEnd)
{
cout< file.close();
exit(0);
}

int c; // 读入字节
int i = 0; // 循环控制变量
int EtherType = 0; // 由帧中读出的类型字段
bool bAccept = true; // 是否接受该帧


// 输出帧的序号
cout << endl << “序号:\t\t“ << nSN;

// 输出前导码,只输出,不校验
cout << endl << “前导码:\t“;
for (i = 0; i < 7; i++) // 输出格式为:AA AA AA AA AA AA AA
{
cout.width(2);
cout << hex << file.get() << dec << “ “;
}
// 输出帧

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2014-09-26 21:03  Ethernet帧结构解析程序\
     目录           0  2014-09-26 21:03  Ethernet帧结构解析程序\frameParser\
     目录           0  2014-09-26 21:03  Ethernet帧结构解析程序\frameParser\Code\
     文件        7734  2014-09-25 18:05  Ethernet帧结构解析程序\frameParser\Code\frameParser.cpp
     文件        4344  2014-09-25 18:05  Ethernet帧结构解析程序\frameParser\Code\frameParser.dsp
     文件         547  2014-09-25 18:05  Ethernet帧结构解析程序\frameParser\Code\frameParser.dsw
     文件       41984  2014-09-25 18:05  Ethernet帧结构解析程序\frameParser\Code\frameParser.ncb
     文件       53760  2014-09-25 18:05  Ethernet帧结构解析程序\frameParser\Code\frameParser.opt
     文件         973  2014-09-25 18:05  Ethernet帧结构解析程序\frameParser\Code\frameParser.plg
     目录           0  2014-09-26 21:03  Ethernet帧结构解析程序\frameParser\Exe\
     文件      245908  2014-09-25 18:05  Ethernet帧结构解析程序\frameParser\Exe\frameParser.exe
     文件        2303  2014-09-25 18:05  Ethernet帧结构解析程序\frameParser\Exe\input
     文件      450824  2014-09-25 18:05  Ethernet帧结构解析程序\frameParser\test.jpg
     文件       54784  2014-09-25 18:05  Ethernet帧结构解析程序\frameParser\使用说明.doc

评论

共有 条评论