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

📄 bencoding.cpp

📁 BitTorrent协议使用的种子文件Torrent中的信息编码Becoding的源文件
💻 CPP
字号:
// 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();
}

bool 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))
				break;//遇到任何错误都终止整个解析
			szCurPos+=iendpos;
		}
		else if(*szCurPos== 'l')
		{
			if(!readlist(szCurPos,iendpos,m_listObj))
				break;
			szCurPos+=iendpos;
		}
		else if(*szCurPos== 'd')
		{
			if(!readdict(szCurPos,iendpos,m_listObj))
				break;
			szCurPos+=iendpos;
		}
		else			
		{
			if(!readstring(szCurPos,iendpos,m_listObj))
				break;
			szCurPos+=iendpos;
		}
	}
	if(*szCurPos==0&&m_plastObj->m_error == enm_BEncodeErr_noerr)
		return true;
	return false;
}
//从当前位置读取一个字符串
bool CBEncode::readstring(char *szCurPos,int & iendpos,list<CBEncodeObjectBase*> & listObj)
{	
	char * szTmp = szCurPos;
	CBEncodeString * pNewString = new CBEncodeString;	
	pNewString->szPos = szCurPos;

	char szLen[20];
	int i = 0;
	while(*szTmp>='0'&&*szTmp<='9')
		szLen[i++]=*(szTmp++);
	szLen[i]=0;
	if(*szTmp==':')
	{
		int ilen = atoi(szLen);
		if(ilen>0)
		{	
			pNewString->m_szData = ++szTmp;
			pNewString->m_ilen = ilen;
			szTmp+=ilen;
		}
		else
			pNewString->m_error = enm_BEncodeErr_errString;
	}
	else
		pNewString->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,int & iendpos,list<CBEncodeObjectBase*> & listObj)
{
	char * szTmp = szCurPos;
	CBEncodeInt * pNewInt= new CBEncodeInt;	
	pNewInt->szPos = szCurPos;

	if(*szTmp == 'i')
	{	
		szTmp++;
		char szLen[20];
		int i = 0;
		while(*szTmp>='0'&&*szTmp<='9')
			szLen[i++]=*(szTmp++);
		szLen[i]=0;
		if(*szTmp=='e')
		{
			pNewInt->m_iValue = atoi(szLen);			
			++szTmp;
		}
		else
			pNewInt->m_error = enm_BEncodeErr_errInt;
	}
	else
		pNewInt->m_error = enm_BEncodeErr_errInt;
	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<CBEncodeObjectBase*> & listObj)
{
	char * szTmp = szCurPos;
	CBEncodeList * pNewList= new CBEncodeList;
	pNewList->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(!readdict(szTmp,ilistendpos,pNewList->m_listObj))
					break;
				szTmp+=ilistendpos;
			}
			else			
			{
				if(!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;
		else
			szTmp++;
	}
	else
		pNewList->m_error = enm_BEncodeErr_errList;
	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<CBEncodeObjectBase*> & listObj)
{
	char * szTmp = szCurPos;
	CBEncodeDict * pNewDict= new CBEncodeDict;
	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,pNewDict->m_listObj))
					break;//遇到任何错误都终止整个解析
				szTmp+=ilistendpos;
			}
			else if(*szTmp== 'l')
			{
				if(!readlist(szTmp,ilistendpos,pNewDict->m_listObj))
					break;
				szTmp+=ilistendpos;
			}
			else if(*szTmp== 'd')
			{
				if(!readdict(szTmp,ilistendpos,pNewDict->m_listObj))
					break;
				szTmp+=ilistendpos;
			}
			else			
			{
				if(!readstring(szTmp,ilistendpos,pNewDict->m_listObj))
					break;
				szTmp+=ilistendpos;
			}
			pNewDict->m_mapObj.insert(pair<string,CBEncodeObjectBase*>(strname,m_plastObj));			
		}	
		if(*szTmp!='e'||m_plastObj->m_error != enm_BEncodeErr_noerr)
			pNewDict->m_error = enm_BEncodeErr_errDict;
		else
			szTmp++;
	}
	else
		pNewDict->m_error = enm_BEncodeErr_errDict;
	listObj.push_back(pNewDict);
	iendpos = szTmp-szCurPos;
	m_plastObj = pNewDict;	
	m_plastObj->ilen = iendpos;
	return pNewDict->m_error == enm_BEncodeErr_noerr?true:false;
}

int main(void)
{
return 0;
}

⌨️ 快捷键说明

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