bencoding編碼解析器

2021-04-19 22:11:04 字數 4389 閱讀 7584

// bencode.h: inte***ce 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

#include

#include

#include

using namespace std;

enum bencodeparsererrorcode

;enum bencodeobjecttype

;class cbencodeobjectbase

virtual ~cbencodeobjectbase(){};

void clear()

public:

bencodeobjecttype m_type; //物件型別

char * szpos; //物件在字串中的位置

int ilen;//物件的資料長度

bencodeparsererrorcode m_error;//錯誤值

};class cbencodeint : public cbencodeobjectbase

virtual ~cbencodeint(){}

public:

int m_ivalue;//整型物件的值

};class cbencodestring : public cbencodeobjectbase

virtual ~cbencodestring(){}

public:

bool getstring(string & strvalue)

return false;

}char * m_szdata;

int m_ilen;

};class cbencodelist : public cbencodeobjectbase

virtual ~cbencodelist()

void clear()

public:

listm_listobj;

};class cbencodedict : public cbencodeobjectbase

virtual ~cbencodedict()

cbencodeobjectbase* getvalue(const char * szname)

void clear()

public:

mapm_mapobj;//

listm_listobj;//真正的物件儲存在list中,list是乙個name物件乙個value物件.map只是乙個對映表,引用了指標而已

};class cbencode

public:

listm_listobj;

cbencodeobjectbase* m_plastobj;//解析出來的最後乙個物件

char * m_sztxt;

};#endif // !defined(afx_bencode_h__4d0bb462_2ae0_45b3_8be8_19d51b2dbb2e__included_)

// bencode.cpp: implementation of the cbencode class.

////

#include "stdafx.h"

#include "bencode.h"

//// construction/destruction

//cbencode::cbencode()

cbencode::~cbencode()

bool cbencode::parse(const char *szdata)

else if(*szcurpos== 'l')

else if(*szcurpos== 'd')

else

}if(*szcurpos==0&&m_plastobj->m_error == enm_bencodeerr_noerr)

return true;

return false;

}//從當前位置讀取乙個字串

bool cbencode::readstring(char *szcurpos,int & iendpos,list& listobj)

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& listobj)

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& listobj)

else if(*sztmp== 'l')

else if(*sztmp== 'd')

else

} 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& listobj)

else if(*sztmp== 'l')

else if(*sztmp== 'd')

else

pnewdict->m_mapobj.insert(pair(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;

}

bencoding編碼詳細解析

bt種子檔案使用了一種叫bencoding的編碼方法來儲存資料。bencoding現有四種型別的資料 srings 字串 integers 整數 lists 列表 dictionaries 字典 編碼規則如下 strings 字串 編碼為 字串長度 字串 例如 4 test 表示為字串 test 4...

使用解析器

使用解析器 使用解析器是非常簡單,可以使用它自己的詞法分析器,但是,用fsyacc.exe 產生的解析器總是要求詞法分析器。在這一小節,我們將討論如何使用自己的詞法分析器,以及與解析器聯合。警告記住f 編譯器不能直接使用.fsl 和 fsy 檔案,需要用fslex.exe 和 fsyacc.exe ...

指令碼解析器

指令碼解析器 命令指令碼解析器,自建立一種指令碼語法,解釋執行它。目前指令碼形式類似於命令,沒有變數型別的概念,關鍵字為 if else while break continue 解釋與c語言一樣。上傳 型別 無型別,全為字串看待。作用域 當前大括號中,以及所有子大括號中,退出當前大括號則清除變數。...