以太网帧解析 实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
nextbyte<<=1;
}
}
CrcRes=CrcRes&0xff;
}
5
南开大学 计算机与控制工程学院
三、测试结果截图
1.第一帧的截图
图3
2.第二帧的截图
图4 6
3.第三帧的截图
南开大学 计算机与控制工程学院
图5
4.第四帧的截图
图6 7
南开大学 计算机与控制工程学院
5.当帧结束时会弹出对话框,截图为
i=-1;
}
mFile.Read(&b,sizeof(byte));++n;
if((int)b==0xAB)// 检测个连续的xaa之后是否为xAB,如果是,跳出循环,不是则继续循
环
{
isContinue=false;
data_num=n-9-temp_data_frame;
last=n-9;
break;
图1
打开文件后,点击按钮“下一帧”,从而实现帧解析的功能。
1
南开大学 计算机与控制工程学院
二、设计思想和流程说明
1.帧解析流程图
开始 解析
判断文件是 否存在及命 令行格式
提示文件错误或正确的 N
命令行格式,退出程序
Y
通过前导码与定界符来定位帧
N 是否找到
Y 输出帧头信息并进行校验
计算数据长度 输出数据字段并进行校验
(3) CRC-8 校验的实现 为了实现简单,程序中使用 CRC-8 校验,一次检验一个字节。CRC-8 一般可
以用移位寄存器来实现,对其计算过程分析可以发现,当寄存器首位的移出位为
1 时,寄存器组才和 00000111 进行 XOR 运算;移出位为 0 时,不做运算。每次
寄存器中的数据左移后就需要从输入数据中读入一位新的数据,如果读入的数据
UINT data_num=0;
//记录LLC帧段一共有多少长度
UINT last=0; //记录CRC校验码的位置
isContinue=true;
while(isContinue)
{
ຫໍສະໝຸດ Baidu
for(int i=0;i<=6;i++)
{
mFile.Seek(n,CFile::begin);
if (n>=fileLength) // 检测是否移动到文件末尾
为 1,则需要把寄存器末尾置为 1,然后再判断寄存器组是否需要与 000000111
进行 XOR 运算。
代码如下:
void Ccomputer_netDlg::checkCrc8(byte &CrcRes, byte nextbyte)
{
// CRC循环:每次调用进行次循环,处理一个字节的数据
for (int i=0; i< 8; i++)
{
if ((CrcRes & 0x80) != 0)
// 若首位为
4
南开大学 计算机与控制工程学院
{
CrcRes <<= 1;
// 左移一位,末尾自动补上
if ( (nextbyte & 0x80) != 0) // 若从nextbyte首位读入数据为
{
CrcRes |= 0x01;//最低位置为
图7
8
}
CrcRes ^=0x07;
//与二进制为进行异或运算,实现校验
nextbyte<<=1;
}
else
// 若首位为,只移位,不进行异或运算
{
CrcRes<<= 1;
// 左移一位
if ( (nextbyte & 0x80) != 0) //若从nextbyte首位读入数据为
{
CrcRes |= 0x01;//最低位置为
CString Ccomputer_netDlg::transfer(byte temp) //将byte类型转换为CSting类型 {
CString str,text=_T(""); int value1=temp; int v1=value1/16; int v2=value1%16; if(v1>=0&&v1<=9)
3
南开大学 计算机与控制工程学院
mFile.Seek(n,CFile::begin); mFile.Read(&b,sizeof(byte));nextcode=b;checkCrc8(CRC,nextcode); ++n; str.Format("%c",b); m_edit+=str; }
(2)字符类型的转换问题 在MFC中,界面使用的是CString类型,然而二进制文件的数据类型是byte类型, 当我们要把二进制文件中的数据以十六进制数字和字母的方式显示在界面上时, 需要特殊的字符转换函数。函数代码如下:
南开大学 计算机与控制工程学院
第一次作业 以太网帧解析程序
姓名:XX 学号:XXXXXXXXXX 专业:XXXXXXX
一、开发环境
运行平台:Windows XP 编程环境:Visual Studio 2008 语言:C++ 执行环境:Windows 窗口 运行方式: 单击 computer_net.exe 文件 出现界面后,单击“打开”按钮,弹出模态对话框,在文件类型中选择“All Files”, 选择 input 文件。
}
}
n=temp_data_frame; //n复原为原来的字节数
int cycle=0; //循环次数
if(data_num<46)//数据帧字段小于个字节要进行补帧
cycle=46;
else
cycle=data_num;
for(int i=0;i<cycle;++i)//写LLC数据字段
{
CString str;
判断校验码是否正确 Y
解析是否完成
N
关闭文件 解析结束
图2
2
南开大学 计算机与控制工程学院
2.程序设计难点 (1) LLC 数据帧长度的确定
由于以太网帧结构中的长度字段为类型字段,所以无法直接确定数据的
长度,本程序通过定位当前帧的下一个帧的位置来确定数据的长度。代码如
下:
UINT temp_data_frame=n; //记录下此时的文件读取位置
str.Format("%d",v1); else
str.Format("%c",55+v1);//超过的部分用大写字母表示 text+=str; if(v2>=0&&v2<=9)
str.Format("%d",v2); else
str.Format("%c",55+v2);//超过的部分用大写字母表示 text+=str; return text; }
{
isContinue=false;
data_num=fileLength-temp_data_frame-1;
last=fileLength-1;
break;
}
mFile.Read(&b,sizeof(byte));++n;
if((int)b!=0xAA)//检测当前字节是否为xAA,如果不是,重新寻找个连续的xAA