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++示例**:
//注:上述**用到了數字跟字串之間的轉換,可自行實現。上述只是分析torrent檔案裡的資訊,如果想得到全部資訊可以這樣呼叫:// 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;
}
string content = "d8:ann..........e"; // content表示torrent檔案的內容如果你想要得到torrent檔案相關欄位的資訊,則還需要對上述**進行封裝,下面給出我封裝過的類。dictnode* pdictnode = new dictnode();
pdictnode->encode(content);
那麼所有的資訊都可以在pdictnode結點裡找到了。
// 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
/注1:該torrent_t結構只是官方發布的torrent檔案可能包含的資訊,如果有torrent檔案有特殊結點也可自己定義,反正所有結點都能在dictnode中找到。// 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;
}
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...