资源简介
完整的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帧结构解析程序\fr
目录 0 2014-09-26 21:03 Ethernet帧结构解析程序\fr
文件 7734 2014-09-25 18:05 Ethernet帧结构解析程序\fr
文件 4344 2014-09-25 18:05 Ethernet帧结构解析程序\fr
文件 547 2014-09-25 18:05 Ethernet帧结构解析程序\fr
文件 41984 2014-09-25 18:05 Ethernet帧结构解析程序\fr
文件 53760 2014-09-25 18:05 Ethernet帧结构解析程序\fr
文件 973 2014-09-25 18:05 Ethernet帧结构解析程序\fr
目录 0 2014-09-26 21:03 Ethernet帧结构解析程序\fr
文件 245908 2014-09-25 18:05 Ethernet帧结构解析程序\fr
文件 2303 2014-09-25 18:05 Ethernet帧结构解析程序\fr
文件 450824 2014-09-25 18:05 Ethernet帧结构解析程序\fr
文件 54784 2014-09-25 18:05 Ethernet帧结构解析程序\fr
- 上一篇:c语言网吧计费系统源代码
- 下一篇:c++ builder socket
相关资源
- 电子宠物C++完整代码可直接运行
- 聊天软件,用套接字编写,完整代码
- VC++斗地主单机版完整代码
- VC++局域网聊天室完整版
- 基于mfc的科学计算器,完整代码附报
- MFC课程设计图书管理系统实验报告内
- MSVC编译器
- C++语言程序设计上机实验课所有实验
- c++ 图像处理
- 任燕《数据结构C++描述》实验指导书
- C/S架构文件传输,socket实现C++完整代
- 航空客运订票系统有完整代码,设计
- 数据结构——表达式求值 完整代码
- C语言 马踏棋盘 完整代码及实验报告
- C语言 图书馆借阅管理系统 完整代码
- 个人通讯录c++版完整代码
- 数据结构 走迷宫大作业 c语言完整代
- 考勤系统C语言实现完整源码+详细说明
- C++实现双向链表完整代码
- C++停车场管理系统的完整代码.txt
- C语言之逆波兰表达式完整代码(附算
- VS2013 MFC ODBC连接SQL SERVER数据库编程完
- GPS单点定位完整代码txt版C++,还有r
- 数据结构之迷宫求解完整代码(C语言
- C语言链表完整代码
- c++版创建并输出二叉树完整代码
- rgb24转yuv420高效率 完整代码,C++实现
- C语言停车场管理系统完整代码
- 校运动会管理系统报告C语言(附完整
- C语言算法速查手册》完整代码.
评论
共有 条评论