📄 framereader.cpp
字号:
#include <fstream.h>
#include <stdio.h>
#include <malloc.h>
#include <CTYPE.h>
#include <conio.h>
#define String char*
typedef unsigned char BYTE;
// 结构体,读取到的帧原始数据
typedef struct{
char content[1500+18]; // 各字节数据
int length; // 实际长度
}OriginalData;
// 分析后的数据帧结构
typedef struct{
String DestMac;
String SourceMac;
int FrameType;
char Data[1500];
int length;
long CRC;
void display(){
printf("目的MAC地址:%s\n", DestMac);
printf("源发MAC地址:%s\n", SourceMac);
printf("帧类型:%04x\n", FrameType);
printf("数据长度:%d\n", length);
printf("CRC:%08x\n", CRC);
printf("数据:\n");
char *pChar = Data;
for ( int j=0; j<length; j++, pChar++ )
printf( "%c", isprint( *pChar ) ? *pChar : '.' );
}
}FrameData;
// 从原始数据帧中获取目的MAC地址
String getDestMac(OriginalData od){
char *d = (char *)malloc(sizeof(char) * 18);
int start=0, length=6;
char *fc;
for(int i=0; i<length; i++){
fc = i==0?"%02x":"-%02x"; // 格式字符串
sprintf(d+i*3-(i==0?0:1), fc, *(BYTE *)(od.content + start + i));
}
d[18] = 0;
return d;
}
// 从原始数据帧中获取源MAC地址
String getSourceMac(OriginalData od){
char *d = (char *)malloc(sizeof(char) * 18);
int start=6, length=6;
char *fc;
for(int i=0; i<length; i++){
fc = i==0?"%02x":"-%02x";
sprintf(d+i*3-(i==0?0:1), fc, *(BYTE *)(od.content + start + i));
}
d[18] = 0;
return d;
}
// 从原始数据帧中获取帧类型
int getFrameType(OriginalData od){
int start=12, length=2;
int result = 0;
result = *(od.content + start) * 256 + *(od.content + start + 1);
return result;
}
// 从原始数据帧中获取数据段 返回数据段实际长度
int getData(OriginalData od, char *d){
int start=14, length = od.length - 4 - 14;
for(int i=0; i<length; i++){
d[i] = od.content[start + i];
}
return length;
}
// 从原始数据帧中获取CRC
long getCRC(OriginalData od){
int start=od.length-4, length=4;
int result=0;
result = *(od.content + start) * 256 * 256 * 256
+ *(od.content + start + 1) * 256 * 256
+ *(od.content + start + 2) * 256
+ *(od.content + start + 3) ;
return result;
}
// 根据原始数据帧,调用上面各函数,生成分析后的数据帧结构
FrameData* getFrameData(OriginalData od){
FrameData *fd = new FrameData();
fd->DestMac = getDestMac(od);
fd->SourceMac = getSourceMac(od);
fd->FrameType = getFrameType(od);
fd->length = getData(od, fd->Data);
fd->CRC = getCRC(od);
return fd;
}
void main(char *args[]){
char *filename = "data.dat";
OriginalData od;
// 从文件中读取帧数据
ifstream fin(filename, ios::binary);
char c;
int length = 0;
while(!fin.eof()){
fin.read(&c, 1);
od.content[length ++] = c;
}
od.length = length - 1; // 帧的实际长度
fin.close();
// 生成分析后的数据帧结构体
FrameData *fd = getFrameData(od);
fd->display();
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -