// 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語言一樣。上傳 型別 無型別,全為字串看待。作用域 當前大括號中,以及所有子大括號中,退出當前大括號則清除變數。...