C 解析torrent檔案

2022-01-25 15:54:10 字數 3805 閱讀 5305

基礎知識:

torrent檔案資訊儲存格式:

bencoding是一種以簡潔格式指定和組織資料的方法。支援下列型別:位元組串、整數、列表和字典。

1 字串儲存格式:  《字串的長度》:《字串的內容》 

例如:    4:abcd 表示abcd, 2:ab 表示ab

2 數字的儲存格式:  i《整數》e

例如:    i32e 表示整數32, i1024e 表示整數1024

3 列表的儲存格式: l《子元素》e  其中:子元素可以是字串,整數,列表和字典,或者是它們的組合體

例如:    l4:asdf4:qwere    表示 [ "asdf", "qwer" ] 

4 字典的儲存格式: d<...>e 

其中:key只能是字串型別,value則可以是字串,整數,列表和字典,或者是它們的組合體,key和value必須是成對出現的

例如:    d3:cow3:moo4:spam4:eggse    表示  

d4:spaml1:a1:bee            表示  

d9:publisher3:bob4:spaml1:a1:be5:counti80ee  表示

**:

1

using

system;

2using

system.collections.generic;

3using

system.io;

4using

system.text;

5using

npoi.openxmlformats.spreadsheet;

6using

newtonsoft.json;78

namespace922

string filename = args[0

];23

var data =torrent.decodefile(filename);

24//

console.writeline(jsonconvert.serializeobject(data, newtonsoft.json.formatting.indented));

25showdata(data);26}

2728

private

static

void

showdata(itembase data)

2949 console.writeline(kv.key + "

=" + (kv.value as

stringitem).stringdata);

50break;51

case

itemtype.number:

52 console.writeline(kv.key + "

=" + (kv.value as

numberitem).numberdata);

53break;54

}55}56

}57if (data.itemtype ==itemtype.list)

5874}75

}76}77

}7879public

class

torrent

8089}90

}9192private

static itembase decodedata(binaryreader br, stack st = null)93

110 st.push(true

);111

do112

118else

119122 } while (st.count != 0 && br.basestream.position !=br.basestream.length);

123124

return

itemls;

125case'd

'://

字典126

br.readbyte();

127var itemdic = new

dictionaryitem();

128var key =decodedata(br);

129while (key != null && br.basestream.position !=br.basestream.length)

130135

136return

itemdic;

137case'i

'://

數字138

br.readbyte();

139 b =br.readbyte();

140while (b != 'e'

)141

145return

new numberitem(long.parse(encoding.utf8.getstring(ls.toarray()))) ;

146default://

字串 147 b =br.readbyte();

148while (b != ':'

)149

153var len = int

.parse(encoding.utf8.getstring(ls.toarray()));

154var bufstr =br.readbytes(len);

155var data =encoding.utf8.getstring(bufstr);

156return

new stringitem(data) ;

157}

158}

159}

160161

public

class

itembase

162165

[jsonignore]

166public

byte rawbytes

167}

168169

public

class

stringitem : itembase

170176

public

string stringdata

177}

178public

class

numberitem : itembase

179185

public

long numberdata

186}

187188

public

class

listitem : itembase

189194

public listlistdata = new list();

195}

196197

public

class

dictionaryitem : itembase

198203

public dictionary dictionarydata = new dictionary();

204}

205206

public

enum

itemtype

207210 }

效果:

Torrent檔案結構解析

torrent檔案內的資料結構分為以下幾部分 announce tracker的主伺服器 announce list tracker伺服器列表 comment 種子檔案的注釋 comment.utf 8 種子檔案注釋的utf 8編碼 creation date 種子檔案建立的時間,是從1970年1月...

torrent檔案分析

torrent檔案資訊儲存格式 bencoding是一種以簡潔格式指定和組織資料的方法。支援下列型別 位元組串 整數 列表和字典。1 字串儲存格式 字串的長度 字串的內容 例如 4 spam 表示spam,2 ab 表示ab 2 數字的儲存格式 i 整數 e 例如 i3e 表示整數3,i1024e ...

BT種子檔案( torrent)的具體檔案結構

全部內容必須都為bencoding編碼型別。整個檔案為乙個字典結構,包含如下關鍵字 announce tracker 伺服器的 url 字串 announce list 可選 備用 tracker 伺服器列表 列表 creation date 可選 種子建立的時間,unix 標準時間格式,從 197...