bencoding编码的解析器_第1页
bencoding编码的解析器_第2页
bencoding编码的解析器_第3页
bencoding编码的解析器_第4页
bencoding编码的解析器_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、BT客户端开始一个下载首先要处理的就是torrent文件.而torrent文件使用bencoding编码.所以实现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).下面是实现的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,/没有错误enm_BEncodeErr_errString,/错误的字符串enm_BEncodeErr_err

6、Int,/错 误的整型数据enm_BEncodeErr_errList,/错 误的歹。表enm_BEncodeErr_errDict,/错误的词典结构enm_BEncodeErr_End,/文 本结束enm_BEncodeErr_unknown/未 知错误;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; /对象类型char * szPos; 对象在字符串中的位置int ilen;/对象的数据长度BEncodeParserErrorCode m_error;/错误值;class

8、 CBEncodeInt : public CBEncodeObjectBasepublic:CBEncodeInt() : CBEncodeObjectBase(enum_BEncodeType_Int) virtual CBEncodeInt()public:int m_iValue;/整型对象的值;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;/真正的对象保存在 list 中,list 是一个 name 对象一 个value对象.map只是一个映射表,引用了指针而已 ;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、解析出来的最后一个对象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/遇到任何错误都终止整个解析 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;从当前位置读取

17、一个字符串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;读取一个整型数据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;读取一个列表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;/遇到任何错误都终止整个解析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;读取一个字典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等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论