




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、BT客戶端開始一個(gè)下載首先要處理的就是torrent文件.而torrent文件使用bencoding編碼.所以實(shí)現(xiàn)bencoding編碼的解析器,就是第一步工作.Bencoding is done as follows:Strings are length-prefixed base ten followed by a colon and the string. For example 4:spam corresponds to spam.Integers are represented by an i followed by the number in base 10 followed by
2、 an e. For example i3e corresponds to 3 and i-3e corresponds to -3. Integers have no size limitation. i-0e is invalid. All encodings with a leading zero, such as i03e, are invalid, other than i0e, which of course corresponds to 0.Lists are encoded as an l followed by their elements (also bencoded) f
3、ollowed by an e. For example l4:spam4:eggse corresponds to spam, eggs.Dictionaries are encoded as a d followed by a list of alternating keys and their corresponding values followed by an e. For example, d3:cow3:moo4:spam4:eggse corresponds to cow: moo, spam: eggs and d4:spaml1:a1:bee corresponds to
4、spam: a, b . Keys must be strings and appear in sorted order (sorted as raw strings, not alphanumerics).下面是實(shí)現(xiàn)的bencoding解碼器的VC+源代碼:/ BEncode.h: interface for the CBEncode class./#if !defined(AFX_BENCODE_H_4D0BB462_2AE0_45B3_8BE8_19D51B2DBB2E_INCLU DED_)#defineAFX_BENCODE_H_4D0BB462_2AE0_45B3_8BE8_19D
5、51B2DBB2E_INCLUDED_ #if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#pragma warning( disable : 4786 )#pragma warning( disable : 4355 )#include #include #include #include using namespace std;enum BEncodeParserErrorCodeenm_BEncodeErr_noerr = 0,/沒有錯(cuò)誤enm_BEncodeErr_errString,/錯(cuò)誤的字符串enm_BEncodeErr_err
6、Int,/錯(cuò) 誤的整型數(shù)據(jù)enm_BEncodeErr_errList,/錯(cuò) 誤的歹。表enm_BEncodeErr_errDict,/錯(cuò)誤的詞典結(jié)構(gòu)enm_BEncodeErr_End,/文 本結(jié)束enm_BEncodeErr_unknown/未 知錯(cuò)誤;enum BEncodeObjectTypeenum_BEncodeType_Objectbase = 0,enum_BEncodeType_String,enum_BEncodeType_Int,enum_BEncodeType_List,enum_BEncodeType_Dict,;class CBEncodeObjectBasepub
7、lic:CBEncodeObjectBase(BEncodeObjectTypetype=enum_BEncodeType_Objectbase)m_type = type;clear();virtual CBEncodeObjectBase();void clear()szPos = NULL;m_error = enm_BEncodeErr_noerr;public:BEncodeObjectType m_type; /對(duì)象類型char * szPos; 對(duì)象在字符串中的位置int ilen;/對(duì)象的數(shù)據(jù)長(zhǎng)度BEncodeParserErrorCode m_error;/錯(cuò)誤值;class
8、 CBEncodeInt : public CBEncodeObjectBasepublic:CBEncodeInt() : CBEncodeObjectBase(enum_BEncodeType_Int) virtual CBEncodeInt()public:int m_iValue;/整型對(duì)象的值;class CBEncodeString : public CBEncodeObjectBasepublic:CBEncodeString() : CBEncodeObjectBase(enum_BEncodeType_String) m_szData =NULL;virtual CBEnco
9、deString()public:bool getstring(string & strValue)if(m_error = enm_BEncodeErr_noerr & m_szData)strValue.assign(m_szData,m_ilen); return true;return false;char * m_szData;int m_ilen;class CBEncodeList : public CBEncodeObjectBasepublic:CBEncodeList() : CBEncodeObjectBase(enum_BEncodeType_List) virtual
10、 CBEncodeList()clear(); void clear() list:iterator it;for(it = m_listObj.begin();it!=m_listObj.end();+it) delete (*it);m_listObj.clear();public:list m_listObj;class CBEncodeDict : public CBEncodeObjectBasepublic:CBEncodeDict() : CBEncodeObjectBase(enum_BEncodeType_Dict) virtual CBEncodeDict()clear()
11、;CBEncodeObjectBase* getvalue(const char * szName) map:iterator it = m_mapObj.find(szName); if(it != m_mapObj.end()return it-second;return NULL;void clear()list:iterator it;for(it = m_listObj.begin();it!=m_listObj.end();+it) delete (*it);m_listObj.clear();m_mapObj.clear();public:map m_mapObj;/list m
12、_listObj;/真正的對(duì)象保存在 list 中,list 是一個(gè) name 對(duì)象一 個(gè)value對(duì)象.map只是一個(gè)映射表,引用了指針而已 ;class CBEncodepublic:bool readint(char *szCurPos,int & iendpos,list & listObj);bool readstring(char *szCurPos,int & iendpos,list & listObj);bool readlist(char *szCurPos,int & iendpos,list & listObj);bool readdict(char *szCurPos
13、,int & iendpos,list & listObj);bool parse(const char * szData);CBEncode();virtual CBEncode();void clear()listvCBEncodeObjectBase *:iterator it;for(it = m_listObj.begin();it!=m_listObj.end();+it) delete (*it);m_listObj.clear();public:listvCBEncodeObjectBase*m_listObj;CBEncodeObjectBase* m_plastObj ;/
14、解析出來的最后一個(gè)對(duì)象char * m_szTxt;#endif/ !defined(AFX_BENCODE_H_4D0BB462_2AE0_45B3_8BE8_19D51B2DBB2E_INCLUD ED_)/ BEncode.cpp: implementation of the CBEncode class./#include stdafx.h#include BEncode.h/ Construction/Destruction/CBEncode:CBEncode()m_plastObj = NULL;m_szTxt = NULL;CBEncode:CBEncode()clear();b
15、ool CBEncode:parse(const char *szData)if(szData = NULL|*szData=NULL) return false;clear();m_szTxt = (char*)szData;char * szCurPos = (char*)szData;int iendpos;while(*szCurPos)if(*szCurPos= i)if(!readint(szCurPos,iendpos,m_listObj)breaW/遇到任何錯(cuò)誤都終止整個(gè)解析 szCurPos+=iendpos;else if(*szCurPos= l)if(!readlist
16、(szCurPos,iendpos,m_listObj) break;szCurPos+=iendpos;else if(*szCurPos= d)if(!readdict(szCurPos,iendpos,m_listObj) break;szCurPos+=iendpos;elseif(!readstring(szCurPos,iendpos,m_listObj) break;szCurPos+=iendpos;if(*szCurPos=0&m_plastObj-m_error = enm_BEncodeErr_noerr) return true;return false;從當(dāng)前位置讀取
17、一個(gè)字符串bool CBEncode:readstring(char *szCurPos,int & iendpos,list & listObj) char * szTmp = szCurPos;CBEncodeString * pNewString = new CBEncodeString;pNewString-szPos = szCurPos;char szLen20;int i = 0;while(*szTmp=0&*szTmp0) pNewString-m_szData = +szTmp;pNewString-m_ilen = ilen;szTmp+=ilen;elsepNewStr
18、ing-m_error = enm_BEncodeErr_errString; elsepNewString-m_error = enm_BEncodeErr_errString;listObj.push_back(pNewString);iendpos = szTmp-szCurPos;m_plastObj = pNewString;m_plastObj-ilen = iendpos;return pNewString-m_error = enm_BEncodeErr_noerr?true:false;讀取一個(gè)整型數(shù)據(jù)bool CBEncode:readint(char *szCurPos,
19、int & iendpos,list & listObj) char * szTmp = szCurPos;CBEncodeInt * pNewInt= new CBEncodeInt;pNewInt-szPos = szCurPos;if(*szTmp = i)szTmp+;char szLen20;int i = 0;while(*szTmp=0&*szTmpm_iValue = atoi(szLen);+szTmp;elsepNewInt-m_error = enm_BEncodeErr_errInt;elsepNewInt-m_error = enm_BEncodeErr_errInt
20、;listObj.push_back(pNewInt);iendpos = szTmp-szCurPos;m_plastObj = pNewInt;m_plastObj-ilen = iendpos;return pNewInt-m_error = enm_BEncodeErr_noerr?true:false;讀取一個(gè)列表bool CBEncode:readlist(char *szCurPos,int & iendpos,list & listObj) char * szTmp = szCurPos;CBEncodeList * pNewList= new CBEncodeList;pNe
21、wList-szPos = szCurPos;if(*szTmp = l)szTmp+;int ilistendpos;while(*szTmp!=e)if(*szTmp= i)if(!readint(szTmp,ilistendpos,pNewList-m_listObj)break;/遇到任何錯(cuò)誤都終止整個(gè)解析szTmp+=ilistendpos;else if(*szTmp= l)if(!readlist(szTmp,ilistendpos,pNewList-m_listObj) break;szTmp+=ilistendpos;else if(*szTmp= d)if(!readdic
22、t(szTmp,ilistendpos,pNewList-m_listObj) break;szTmp+=ilistendpos;elseif(!readstring(szTmp,ilistendpos,pNewList-m_listObj) break;szTmp+=ilistendpos;if(*szTmp!=e|m_plastObj-m_error != enm_BEncodeErr_noerr) pNewList-m_error = enm_BEncodeErr_errList;elseszTmp+;elsepNewList-m_error = enm_BEncodeErr_errLi
23、st;listObj.push_back(pNewList);iendpos = szTmp-szCurPos;m_plastObj = pNewList;m_plastObj-ilen = iendpos;return pNewList-m_error = enm_BEncodeErr_noerr?true:false;讀取一個(gè)字典bool CBEncode:readdict(char *szCurPos,int & iendpos,list & listObj) char * szTmp = szCurPos;CBEncodeDict * pNewDict= new CBEncodeDic
24、t;pNewDict-szPos = szCurPos;if(*szTmp = d)szTmp+;int ilistendpos;string strname;while(*szTmp!=e)if(!readstring(szTmp,ilistendpos,pNewDict-m_listObj) break;if(m_plastObj-m_type !=enum_BEncodeType_String) break;strname.assign(CBEncodeString *)m_plastObj)-m_szData,(CBEncodeString *)m_plastObj)-m_ilen);szTmp+=ilistendpos;if(*szTmp= i)if(!readint(szTmp,ilistendpos,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 碼頭貨物運(yùn)輸合同
- 工程熱力學(xué)模擬試答題
- 企業(yè)內(nèi)部年度財(cái)務(wù)分析報(bào)告
- 寓言故事烏鴉喝水的啟示讀后感
- 企業(yè)知識(shí)產(chǎn)權(quán)保護(hù)及維權(quán)服務(wù)協(xié)議
- 年度目標(biāo)達(dá)成報(bào)告
- 大數(shù)據(jù)挖掘在輿情監(jiān)控中的應(yīng)用實(shí)踐指南
- 如何正確使用辦公軟件提高效率
- 太陽(yáng)能光伏發(fā)電系統(tǒng)安裝合同
- 人與自然紀(jì)錄片評(píng)析和諧共生的啟示
- 牛羊定點(diǎn)屠宰廠項(xiàng)目可行性研究報(bào)告寫作模板-申批備案
- 2025年黑龍江農(nóng)業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)及答案1套
- 某工程通風(fēng)空調(diào)工程施工方案
- 遼寧省五校聯(lián)考2024-2025學(xué)年高二上學(xué)期期末英語(yǔ)試卷(解析版)
- 2025年湖南食品藥品職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年常考版參考題庫(kù)含答案解析
- 2025年泰山職業(yè)技術(shù)學(xué)院高職單招數(shù)學(xué)歷年(2016-2024)頻考點(diǎn)試題含答案解析
- 近岸海上柔性光伏支架結(jié)構(gòu)研究
- 2025年廣西投資集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 2024年華北電力大學(xué)輔導(dǎo)員及其他崗位招聘考試真題
- 2024年湖北省煙草專賣局(公司)招聘考試真題
- 青島版科學(xué)四年級(jí)下冊(cè)《認(rèn)識(shí)太陽(yáng)》課件
評(píng)論
0/150
提交評(píng)論