資源簡介
完整的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?<“請以幀封裝包文件為參數重新執行程序“?< exit(0);
}
//?檢測輸入文件是否存在,并可以按所需的權限和方式打開
ifstream?file(argv[1]?ios::in|ios::binary|ios::nocreate);
if?(!file.is_open())
{
cout?<“無法打開幀封裝包文件,請檢查文件是否存在并且未損壞“?< 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?<
//?輸出前導碼,只輸出,不校驗
cout?< for?(i?=?0;?i?7;?i++) //?輸出格式為:AA?AA?AA?AA?AA?AA?AA
{
cout.width(2);
cout?< }
//?輸出幀
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????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
評論
共有 條評論