BT协议中大部分信息传递是用的Bencoding过的数据, 同样, torrent 文件也不例外
Bencoding 支持四种格式
- 字符串
- 数字
- 列表
- 字典
对于字符串,首先是一个字符串的长度,然后是冒号,后面跟着实际的字符串,例如: 4:spam,就是" spam"
整数编码如下,以 'i' 开始,然后10进制的整数值,最后以'e'结尾。例如,i3e表示3,I-3e表示-3。整数没有大小限制。I-0e是无效的。除了 i0e外,所以以0起始的整数都无效。I0e当然表示0。
列表编码如下,以'l'开始,接下来是列表值的编码(也采用bencoded编码),最后以'e'结束。例如:l4:spam4:eggse 表示 ['spam', 'eggs']。
字典编码如下,以'd'开始,接下来是可选的keys和它对应的值,最户以'e'结束。例如:d3:cow3:moo4:spam4:eggse,表示{'cow':'moo','spam':'eggs'},而d4:spaml1:al:bee 表示 {'spam':['a','b']}。键值必须是字符串,而且已经排序(并非是按照字母顺序排序,而是根据原始的字符串进行排序)。
torrent 文件是一个字典结构,包括以下几个关键字
- info 字典结构,里面描述了文件的一些信息, 包括两种情况,一是单个文件,再一个就是包括目录的多个文件
- announce string 结构,tracker 的发布地址
- announce-list 列表, 多个tracker 地址
- creation date 数字(可选) 发布时间
- comment string 注释
- created by string, 发布者
Info 的结构
下面部分在单个文件与多个文件中都存在
- piece length 整数,每块的大小
- pieces 整数, 块数
- private 整数,如果设置为1,客户端必要从 metafile 文件中的tracker 得到种子, 如果没有设置或,设置为零,则可从任何途径获得种子
描述单个文件
- name 字符串,文件名
- length 整数,文件大小
- md5sum 可选,文件的md5值, 32个字符
描述多个文件
- name 文件夹的名字
- files 一个字典组成的列表, 每一项有以下关键字
-
- lenght 整数, 文件大小
- md5sum, 字符串, 可选
- path 路径,文件夹和文件名的 bencode 编码的列表
下面是一个 torrent 文件常见的信息:
encoding GBK
creation date 1181982346
announce-list [['http://btfans.3322.org:6969/announce'], ['http://tracker.cnxp.com:8080/announce']]
created by BitComet/0.70
announce http://btfans.3322.org:6969/announce
nodes [['125.224.249.240', 27381], ['83.248.132.94', 17200], ['85.186.126.127',12781], ['205.246.154.159', 9801], ['89.38.47.85', 10642], ['202.103.25.35', 22941], ['84.121.43.81', 12988], ['84.36.5.107', 14395], ['193.230.202.197', 14571], ['216.55.147.120', 16612]]
info
files
----path ['The Scorpion King 2002.txt']
----length 2495
----path.utf-8 ['The Scorpion King 2002.txt']
publisher 影视帝国
piece length 262144
piece "...." 是每块的sha1值
name [2007.06.16]蝎子王[盗墓迷城前传](帝国出品)
publisher.utf-8 影视帝国
name.utf-8 [2007.06.16]蝎子王[盗墓迷城前传](帝国出品)publisher-url.utf-8 http://www.cnxp.com
publisher-url http://www.cnxp.com
下面是一个python解析 Bencoding 的完整代码