torrent檔案分析

2021-09-07 21:14:11 字數 4490 閱讀 9517

torrent檔案資訊儲存格式:

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

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

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

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

例如:    i3e 表示整數3, i1024e 表示整數1024

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

例如:    l4:spam4:eggse    表示 [ "spam", "eggs" ]

l3:logi32ee        表示 [ "log", 32 ]

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

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

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

d4:spaml1:a1:bee            表示

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

torrent檔案的資訊:

announce:                tracker伺服器的url(字串)

announce-list(可選):    備用tracker伺服器列表(列表)

creation date(可選):    種子建立的時間,unix標準時間格式,從2023年1月1日 00:00:00到建立時間的秒數(整數)

comment(可選):            備註(字串)

created by(可選):        建立人或建立程式的資訊(字串)

info:                乙個字典結構,包含檔案的主要資訊,為分二種情況:單檔案結構或多檔案結構

piece length:    每個塊的大小,單位位元組(整數)

pieces:            每個塊的20個位元組的sha1 hash的值(二進位制格式)

單檔案結構如下:

name:            檔名(字串)

length:            檔案長度,單位位元組(整數)

多檔案結構如下:

name:            目錄名(字串)

files:            乙個字典結構的列表,字典結構至少包含下面兩個資訊

length:        檔案長度,單位位元組(整數)

path:        檔案的路徑和名字,是乙個列表結構,如"test"test.txt 列表為l4:test8test.txte

torrent檔案解析的**:

下面給出解析torrent檔案c++示例**:

//

// inte***cebencode.h

#pragma once

#include "inte***cestring.h"

////    torrent資訊儲存文法分析

//    ::=

//    ::= d<| | | e

//    ::= l| | | e

//    ::= :

//    ::= ie

//class inode

virtual bool encode(string& content) = 0;

};class stringnode : public inode

virtual bool encode(string& content);

string m_value;

};class intnode : public inode

virtual bool encode(string& content);

int m_value;

};class dictnode : public inode

m_map_nodes.clear();

}virtual bool encode(string& content);

mapm_map_nodes;

};class listnode : public inode

virtual bool encode(string& content);

vectorm_nodes;

};bool stringnode::encode(string& content)

bool intnode::encode(string& content)

size_t pos = content.find('e', 0);

if (pos == string::npos)

return false;

string s_value = content.substr(1, pos-1);

inte***cestring::to_number(s_value, m_value);

content = content.erase(0, s_value.size()+2);

return true;

}bool dictnode::encode(string& content)

content = content.erase(0, 1);

while (!content.empty())

}return true;

}bool listnode::encode(string& content)

content = content.erase(0, 1);

while (!content.empty())

}return true;

}

注:上述**用到了數字跟字串之間的轉換,可自行實現。上述只是分析torrent檔案裡的資訊,如果想得到全部資訊可以這樣呼叫:

string content = "d8:ann..........e"; // content表示torrent檔案的內容

dictnode* pdictnode = new dictnode();

pdictnode->encode(content);

那麼所有的資訊都可以在pdictnode結點裡找到了。

如果你想要得到torrent檔案相關欄位的資訊,則還需要對上述**進行封裝,下面給出我封裝過的類。

// inte***cetorrentfile.h

#pragma once

// begin namespace core_common

namespace core_common   

;struct infos_t

;struct torrent_t

;public:

///將torrent檔案的字串轉化為torrent結構

static bool encode(const string& content, torrent_t& torrent);

///將torrent結構轉化為torrent檔案的字串

//static bool decode(const torrent_t& torrent, string& content);

};};    // end namespace core_common

/

// inte***cetorrentfile.cpp

#include "inte***cebencode.h"

#include "inte***cetorrent.h"

using namespace core_common;

inode* find_node(const map& node_map, const string& key)

return null;

}string get_node_value(stringnode* strnode)

uint64_t get_node_value(intnode* intnode)

bool torrentfile::encode(const string& torrent_content, torrent_t& torrent)

}// 查詢 info

inode* pnode = find_node(pdictnode->m_map_nodes, "info");

if (pnode != null)

}torrent.infos.files.push_back(file);}}

}}else

}delete pdictnode;

return true;

}

注1:該torrent_t結構只是官方發布的torrent檔案可能包含的資訊,如果有torrent檔案有特殊結點也可自己定義,反正所有結點都能在dictnode中找到。

Torrent檔案結構解析

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

C 解析torrent檔案

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

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

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