-
大小: 540KB文件類型: .zip金幣: 2下載: 1 次發(fā)布日期: 2021-05-09
- 語言: C/C++
- 標(biāo)簽: 完整代碼??VC編譯??cmd運(yùn)行??
資源簡介
完整的C++代碼,VC編譯后生成FrameParser.exe,然后在cmd運(yùn)行解析FrameParser.exe input;

代碼片段和文件信息
#include //?用于文件操作
#include //?用于程序流程控制
////////////////////////////////////////////////////////////////////////////////
//?CRC校驗(yàn),在上一輪校驗(yàn)的基礎(chǔ)上繼續(xù)作8位CRC校驗(yàn)
//?
// 輸入?yún)?shù):
// chCurrByte 低8位數(shù)據(jù)有效,記錄了上一次CRC校驗(yàn)的余數(shù)
// chNextByte 低8位數(shù)據(jù)有效,記錄了本次要繼續(xù)校驗(yàn)的一個(gè)字節(jié)
//
// 傳出參數(shù):
// chCurrByte 低8位數(shù)據(jù)有效,記錄了本次CRC校驗(yàn)的余數(shù)
////////////////////////////////////////////////////////////////////////////////
void?checkCRC(int?&chCurrByte?int?chNextByte)
{
//?CRC循環(huán):每次調(diào)用進(jìn)行8次循環(huán),處理一個(gè)字節(jié)的數(shù)據(jù)。
for?(int?nMask?=?0x80;?nMask?>?0;?nMask?>>=?1)
{
if?((chCurrByte?&?0x80)?!=?0) //?首位為1:移位,并進(jìn)行異或運(yùn)算
{
chCurrByte?<<=?1; //?移一位
if?(?(chNextByte?&?nMask)?!=?0) //?補(bǔ)一位
{
chCurrByte?|=?1;
}
chCurrByte?^=?7; //?首位已經(jīng)移出,僅對(duì)低8位進(jìn)行異或運(yùn)算,7的二進(jìn)制為00000111
}
else //?首位為0,只移位,不進(jìn)行異或運(yùn)算
{
chCurrByte?<<=?1; //?移一位
if?(?(chNextByte?&?nMask)?!=?0) //?補(bǔ)一位
{
chCurrByte?|=?1;
}
}
}
}
void?main(int?argc?char*?argv[])
{
//?檢測命令行參數(shù)的正確性
if?(argc?!=?2)
{
cout?<“請以幀封裝包文件為參數(shù)重新執(zhí)行程序“?< exit(0);
}
//?檢測輸入文件是否存在,并可以按所需的權(quán)限和方式打開
ifstream?file(argv[1]?ios::in|ios::binary|ios::nocreate);
if?(!file.is_open())
{
cout?<“無法打開幀封裝包文件,請檢查文件是否存在并且未損壞“?< exit(0);
}
//?變量聲明及初始化
int?nSN?=?1; //?幀序號(hào)
int?nCheck?=?0; //?校驗(yàn)碼
int?nCurrDataOffset?=?22; //?幀頭偏移量
int?nCurrDataLength?=?0; //?數(shù)據(jù)字段長度
bool?bParseCont?=?true; //?是否繼續(xù)對(duì)輸入文件進(jìn)行解析
int?nFileEnd?=?0; //?輸入文件的長度
//?計(jì)算輸入文件的長度
file.seekg(0?ios::end); //?把文件指針移到文件的末尾
nFileEnd?=?file.tellg(); //?取得輸入文件的長度
file.seekg(0?ios::beg); //?文件指針位置初始化
cout.fill(‘0‘); //?顯示初始化
cout.setf(ios::uppercase); //?以大寫字母輸出
//?定位到輸入文件中的第一個(gè)有效幀
//?從文件頭開始,找到第一個(gè)連續(xù)的“AA-AA-AA-AA-AA-AA-AA-AB”
while?(?true?)
{
for?(int?j?=?0;?j?7;?j++) //?找7個(gè)連續(xù)的0xaa
{
if?(file.tellg()?>=?nFileEnd) //?安全性檢測
{
cout<<“沒有找到合法的幀“< file.close();
exit(0);
}
//?看當(dāng)前字符是不是0xaa,如果不是,則重新尋找7個(gè)連續(xù)的0xaa
if?(file.get()?!=?0xaa)
{
j?=?-1;
}
}
if?(file.tellg()?>=?nFileEnd) //?安全性檢測
{
cout<<“沒有找到合法的幀“< file.close();
exit(0);
}
if?(file.get()?==?0xab) //?判斷7個(gè)連續(xù)的0xaa之后是否為0xab
{
break;
}
}
//?將數(shù)據(jù)字段偏移量定位在上述二進(jìn)制串之后14字節(jié)處,并準(zhǔn)備進(jìn)入解析階段
nCurrDataOffset?=?file.tellg()?+?14;
file.seekg(-8ios::cur);
//?主控循環(huán)
while?(?bParseCont?)?//?當(dāng)仍然可以繼續(xù)解析輸入文件時(shí)繼續(xù)解析
{
//?檢測剩余文件是否可能包含完整幀頭
if?(file.tellg()?+?14?>?nFileEnd)
{
cout< file.close();
exit(0);
}
int?c; //?讀入字節(jié)
int?i?=?0; //?循環(huán)控制變量
int?EtherType?=?0; //?由幀中讀出的類型字段
bool?bAccept?=?true; //?是否接受該幀
//?輸出幀的序號(hào)
cout?<
//?輸出前導(dǎo)碼,只輸出,不校驗(yàn)
cout?< for?(i?=?0;?i?7;?i++) //?輸出格式為:AA?AA?AA?AA?AA?AA?AA
{
cout.width(2);
cout?< }
//?輸出幀
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2014-09-26?21:03??Ethernet幀結(jié)構(gòu)解析程序\
?????目錄???????????0??2014-09-26?21:03??Ethernet幀結(jié)構(gòu)解析程序\fr
?????目錄???????????0??2014-09-26?21:03??Ethernet幀結(jié)構(gòu)解析程序\fr
?????文件????????7734??2014-09-25?18:05??Ethernet幀結(jié)構(gòu)解析程序\fr
?????文件????????4344??2014-09-25?18:05??Ethernet幀結(jié)構(gòu)解析程序\fr
?????文件?????????547??2014-09-25?18:05??Ethernet幀結(jié)構(gòu)解析程序\fr
?????文件???????41984??2014-09-25?18:05??Ethernet幀結(jié)構(gòu)解析程序\fr
?????文件???????53760??2014-09-25?18:05??Ethernet幀結(jié)構(gòu)解析程序\fr
?????文件?????????973??2014-09-25?18:05??Ethernet幀結(jié)構(gòu)解析程序\fr
?????目錄???????????0??2014-09-26?21:03??Ethernet幀結(jié)構(gòu)解析程序\fr
?????文件??????245908??2014-09-25?18:05??Ethernet幀結(jié)構(gòu)解析程序\fr
?????文件????????2303??2014-09-25?18:05??Ethernet幀結(jié)構(gòu)解析程序\fr
?????文件??????450824??2014-09-25?18:05??Ethernet幀結(jié)構(gòu)解析程序\fr
?????文件???????54784??2014-09-25?18:05??Ethernet幀結(jié)構(gòu)解析程序\fr
評(píng)論
共有 條評(píng)論