?? framehandler.h
字號:
#ifndef FRAMEHANDLER_H
#define FRAMEHANDLER_H
// 定義結(jié)構(gòu)體FrameFront來表示Ethernet幀的數(shù)據(jù)段之前的部分
// 即包括:7Bytes的前導(dǎo)碼、1Byte的幀前定位符、6Bytes的目的MAC地址、6Bytes的源MAC地址、2Bytes的數(shù)據(jù)段長度
// 該結(jié)構(gòu)體不包括數(shù)據(jù)段和CRC字段
struct FrameFront
{
unsigned char preamble[8]; // 前7個字節(jié)為前導(dǎo)碼,正確值應(yīng)為十六進(jìn)制的AA-AA-AA-AA-AA-AA-AA,
// 最后一個字節(jié)為幀前定位符,正確值應(yīng)為十六進(jìn)制的AB
unsigned char destMAC[6]; // 目的MAC地址,該字段的長度6Bytes
unsigned char srcMAC[6]; // 源MAC地址,該字段的長度為6Bytes
unsigned char dataLength[2]; // 數(shù)據(jù)段的長度,該字段長度為2Bytes
};
// 定義類FrameHandler來處理幀的解析與封裝
class FrameHandler
{
public:
// 接口
FrameHandler(bool isPackaging, const char* filePath); // 構(gòu)造函數(shù),需指定操作類型(true為封裝,false為解析)
// 和文件路徑(相對路徑)
~FrameHandler(); // 析構(gòu)函數(shù),釋放已申請的資源
bool package(); // 將用戶輸入的信息封裝成幀,保存在filePath指定的文件中
bool unpackage(); // 從成員變量filePath指定的文件中解析Ethernet幀
protected:
// 內(nèi)部輔助函數(shù)
bool isLegalPreamble(const unsigned char* preamble); // 判斷給定幀的前導(dǎo)碼以及幀前定位符是否合法,
// 即是否為十六進(jìn)制的AA-AA-AA-AA-AA-AA-AA-AB
unsigned char getCRC(const FrameFront& frameFront, const unsigned char* data); // 計算crc校驗碼,調(diào)用generateCRC()完成
unsigned char generateCRC(const unsigned char* dataForCRC, int length); // 實際完成CRC校驗碼的計算
bool loadDataFromFile(char* data); // 從文件中讀入數(shù)據(jù),放入字符數(shù)組data中
void setFrameFront(FrameFront& frameFront, const char* data); // 設(shè)定前導(dǎo)碼、幀前定位符、目的地址、源地址、數(shù)據(jù)長度等
bool storeFrameInFile(const FrameFront& frameFront, const char* data, const unsigned char crc); // 將Ethernet幀
// 保存到文件中
void outputFrameFront(const FrameFront& frameFront); // 將前導(dǎo)碼、幀前定位符、目的地址、源地址、數(shù)據(jù)長度等輸出
private:
char* filePath; // 在幀解析時,指定待解析的文件的路徑;
// 在幀封裝時,指定封裝后的數(shù)據(jù)所存放的文件路徑;該值在構(gòu)造函數(shù)中被初始化
bool isPackaging; // 該值表示操作的類型,為true表示進(jìn)行幀封裝操作,為false表示進(jìn)行幀解析操作;
// 該值在構(gòu)造函數(shù)中被初始化
// 內(nèi)部輔助數(shù)據(jù)
enum {MIN_DATA_LENGTH = 46}; // 數(shù)據(jù)段的最小長度,單位:字節(jié)
enum {MAX_DATA_LENGTH = 1500}; // 數(shù)據(jù)段的最大長度,單位:字節(jié)
char hexAlpha[16]; // 在構(gòu)造函數(shù)中為該數(shù)組賦值為:
// {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
// 用來將一個4bits的二進(jìn)制值轉(zhuǎn)換成對應(yīng)的十六進(jìn)制字符
enum {WIDTH = 10}; // 定義標(biāo)題列的寬度為10個字符,
// 所謂標(biāo)題列是指“序號:”、“目的地址”、“CRC校驗”等字符串
};
#endif // FRAMEHANDLER_H
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -