⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bencode.h

📁 BitTorrent协议使用的种子文件Torrent中的信息编码Becoding的源文件
💻 H
字号:
// BEncode.h: interface for the CBEncode class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_BENCODE_H__4D0BB462_2AE0_45B3_8BE8_19D51B2DBB2E__INCLUDED_)
#define AFX_BENCODE_H__4D0BB462_2AE0_45B3_8BE8_19D51B2DBB2E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#pragma warning( disable : 4786 )
#pragma warning( disable : 4355 )
#include <list>
#include <map>
#include <string>
#include <vector>
using namespace std;
enum BEncodeParserErrorCode
{
	enm_BEncodeErr_noerr = 0,//没有错误	
	enm_BEncodeErr_errString,//错误的字符串
	enm_BEncodeErr_errInt,//错误的整型数据
	enm_BEncodeErr_errList,//错误的列表
	enm_BEncodeErr_errDict,//错误的词典结构
	enm_BEncodeErr_End,//文本结束
	enm_BEncodeErr_unknown//未知错误
};
enum BEncodeObjectType
{
	enum_BEncodeType_Objectbase = 0,	
	enum_BEncodeType_String,
	enum_BEncodeType_Int,
	enum_BEncodeType_List,
	enum_BEncodeType_Dict,
};
class CBEncodeObjectBase
{
public:
	CBEncodeObjectBase(BEncodeObjectType type = 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 CBEncodeInt : public CBEncodeObjectBase
{
public:
	CBEncodeInt() : CBEncodeObjectBase(enum_BEncodeType_Int) {}
	virtual ~CBEncodeInt(){}		
public:	
	int m_iValue;//整型对象的值
};
class CBEncodeString : public CBEncodeObjectBase
{
public:
	CBEncodeString() : CBEncodeObjectBase(enum_BEncodeType_String) {m_szData = NULL;}
	virtual ~CBEncodeString(){}		
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 CBEncodeObjectBase
{
public:
	CBEncodeList() : CBEncodeObjectBase(enum_BEncodeType_List) {}
	virtual ~CBEncodeList(){clear();}
	void clear()
	{			
		list<CBEncodeObjectBase *>::iterator it;
		for(it = m_listObj.begin();it!=m_listObj.end();++it)
			delete (*it);
		m_listObj.clear();
	}
public:	
	list<CBEncodeObjectBase*> m_listObj;
};
class CBEncodeDict : public CBEncodeObjectBase
{
public:
	CBEncodeDict() : CBEncodeObjectBase(enum_BEncodeType_Dict) {}
	virtual ~CBEncodeDict(){clear();}
	CBEncodeObjectBase* getvalue(const char * szName)
	{
		map<string,CBEncodeObjectBase*>::iterator it = m_mapObj.find(szName);
		if(it != m_mapObj.end())
			return it->second;
		return NULL;
	}
	void clear()
	{			
		list<CBEncodeObjectBase *>::iterator it;
		for(it = m_listObj.begin();it!=m_listObj.end();++it)
			delete (*it);
		m_listObj.clear();
		m_mapObj.clear();
	}
public:	
	map<string,CBEncodeObjectBase*> m_mapObj;//
	list<CBEncodeObjectBase*> m_listObj;//真正的对象保存在list中,list是一个name对象一个value对象.map只是一个映射表,引用了指针而已
};
class CBEncode
{
public:
	bool readint(char *szCurPos,int & iendpos,list<CBEncodeObjectBase*> & listObj);
	bool readstring(char *szCurPos,int & iendpos,list<CBEncodeObjectBase*> & listObj);	
	bool readlist(char *szCurPos,int & iendpos,list<CBEncodeObjectBase*> & listObj);	
	bool readdict(char *szCurPos,int & iendpos,list<CBEncodeObjectBase*> & listObj);	
	bool parse(const char * szData);
	CBEncode();
	virtual ~CBEncode();
	void clear()
	{	
		list<CBEncodeObjectBase *>::iterator it;
		for(it = m_listObj.begin();it!=m_listObj.end();++it)
			delete (*it);
		m_listObj.clear();	
	}
public:
	list<CBEncodeObjectBase*> m_listObj;
	CBEncodeObjectBase* m_plastObj;//解析出来的最后一个对象
	char * m_szTxt;
};

#endif // !defined(AFX_BENCODE_H__4D0BB462_2AE0_45B3_8BE8_19D51B2DBB2E__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -