📄 framehandler.h
字号:
#ifndef FRAMEHANDLER_H
#define FRAMEHANDLER_H
// 定义结构体FrameFront来表示Ethernet帧的数据段之前的部分
// 即包括:7Bytes的前导码、1Byte的帧前定位符、6Bytes的目的MAC地址、6Bytes的源MAC地址、2Bytes的数据段长度
// 该结构体不包括数据段和CRC字段
struct FrameFront
{
unsigned char preamble[8]; // 前7个字节为前导码,正确值应为十六进制的AA-AA-AA-AA-AA-AA-AA,
// 最后一个字节为帧前定位符,正确值应为十六进制的AB
unsigned char destMAC[6]; // 目的MAC地址,该字段的长度6Bytes
unsigned char srcMAC[6]; // 源MAC地址,该字段的长度为6Bytes
unsigned char dataLength[2]; // 数据段的长度,该字段长度为2Bytes
};
// 定义类FrameHandler来处理帧的解析与封装
class FrameHandler
{
public:
// 接口
FrameHandler(bool isPackaging, const char* filePath); // 构造函数,需指定操作类型(true为封装,false为解析)
// 和文件路径(相对路径)
~FrameHandler(); // 析构函数,释放已申请的资源
bool package(); // 将用户输入的信息封装成帧,保存在filePath指定的文件中
bool unpackage(); // 从成员变量filePath指定的文件中解析Ethernet帧
protected:
// 内部辅助函数
bool isLegalPreamble(const unsigned char* preamble); // 判断给定帧的前导码以及帧前定位符是否合法,
// 即是否为十六进制的AA-AA-AA-AA-AA-AA-AA-AB
unsigned char getCRC(const FrameFront& frameFront, const unsigned char* data); // 计算crc校验码,调用generateCRC()完成
unsigned char generateCRC(const unsigned char* dataForCRC, int length); // 实际完成CRC校验码的计算
bool loadDataFromFile(char* data); // 从文件中读入数据,放入字符数组data中
void setFrameFront(FrameFront& frameFront, const char* data); // 设定前导码、帧前定位符、目的地址、源地址、数据长度等
bool storeFrameInFile(const FrameFront& frameFront, const char* data, const unsigned char crc); // 将Ethernet帧
// 保存到文件中
void outputFrameFront(const FrameFront& frameFront); // 将前导码、帧前定位符、目的地址、源地址、数据长度等输出
private:
char* filePath; // 在帧解析时,指定待解析的文件的路径;
// 在帧封装时,指定封装后的数据所存放的文件路径;该值在构造函数中被初始化
bool isPackaging; // 该值表示操作的类型,为true表示进行帧封装操作,为false表示进行帧解析操作;
// 该值在构造函数中被初始化
// 内部辅助数据
enum {MIN_DATA_LENGTH = 46}; // 数据段的最小长度,单位:字节
enum {MAX_DATA_LENGTH = 1500}; // 数据段的最大长度,单位:字节
char hexAlpha[16]; // 在构造函数中为该数组赋值为:
// {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
// 用来将一个4bits的二进制值转换成对应的十六进制字符
enum {WIDTH = 10}; // 定义标题列的宽度为10个字符,
// 所谓标题列是指“序号:”、“目的地址”、“CRC校验”等字符串
};
#endif // FRAMEHANDLER_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -