年年末的时候,有个朋友说要做一个BT协议的上传和下载,要俺帮忙,于是在那个时候搜寻了各种关于种子文件的文件格式资料。顺便整了一个BT格式的分析类库出来。目前,貌似朋友那便没说要继续整BT协议的上传和下载了,估计大概换了协议吧,呵呵。所以这个放在手里也用处不大了,刚好又很久没写博了,这个就作为当年的第一篇开篇博客吧。言归正传,正文开始
说到BT的种子文件格式,首先我们必须要了解的就是Bencoding编码格式。关于这个格式的定义,基本上还是比较简明的,B编码总共只支持4种类型,既整数,字符串,列表和字典。整数以i标记开头以e标记结尾,中间是整数数字,字符串以:标记开头然后根接字符串的长度,最后是字符串内容,列表以l标记开头,以e结尾,字典以d开头以e结尾。列表可以包含任何的BT元素,字典也可以包含任何的BT元素,不过字典的Key必须是字符串。如此以来分析,整数和字符串是两种单元的元素,可以很好的解析,基本上不用分析就能搞定,而列表和字典,则就需要根据给定的字符串进行分析处理了,这个分析实际上也简单,先碰到开头的标记,然后不断的往下判断读取,碰到结尾标记e结束,如果在碰到结尾标记之前还又碰到其他的标记,则可进行递归处理,所以,处理起来也方便了。
B编码解析完成,那么BT种子文件的处理也就简单了。BT种子文件实际上就是由B编码的字典组成,其内部的字典键介绍,可以参考相关资料,这里我摘录一些如下:
Torrent文件内的数据结构分为以下几部分:
announce:Tracker的主服务器
announce-list:Tracker服务器列表
comment:种子文件的注释
comment.utf-8:种子文件注释的utf-8编码
creation date:种子文件建立的时间,是从1970年1月1日00:00:00到现在的秒数。
encoding:种子文件的默认编码,比如GB2312,Big5,utf-8等
info:所有关于下载的文件的信息都在这个字段里,它包括多个子字段,而且根据下载的是单个文件还是多个文件,子字段的项目会不同。
当种子里包含多个文件时,info字段包括如下子字段:
files:表示文件的名字,大小,该字段包含如下三个子字段:
lenghth:文件的大小,用byte计算
path:文件的名字,在下载时不可更改
path.utf-8:文件名的UTF-8编码,同上
以上的三个字段每个文件都有一组值。
name:推荐的文件夹名,此项可于下载时更改。
name.utf-8:推荐的文件夹名的utf-8编码,同上。
piece length:每个文件块的大小,用Byte计算
pieces:文件的特征信息,该字段比较大,实际上是种子内包含所有的文件段的SHA1的校验值的连接,即将所有文件按照piece length的字节大小分成块,每块计算一个SHA1值,然后将这些值连接起来就形成了pieces字段,由于SHA1的校验值为20Byte,所以该字段的大小始终为20的整数倍字节。该字段是Torrent文件中体积最大的部分,可见如果大文件分块很小,会造成Torrent文件体积庞大。
publisher:文件发布者的名字
publisher.utf-8:文件发布者的名字的utf-8编码
publisher-url:文件发布者的网址
publisher-url.utf-8:文件发布者网址的utf-8编码。
另外,当发布单文件时,files字段是没有的,而
lenghth:
name:
name.utf-8:
这三个字段负责描述单文件的属性:大小,名字,名字的utf-8编码。其他项目和多文件相同。
以上的项目即为info字段的全部。
说到info就不得不说INFO_HASH,这个值是info字段的HASH值,20个Byte,同样是使用SHA1作为HASH函数。由于info字段是发布的文件信息构成的,所以INFO_HASH在BT协议中是用来识别不同的种子文件的。基本上每个种子文件的INFO_HASH都是不同的(至少现在还没有人发现有SHA的冲突),所以BT服务器以及客户端都是以这个值来识别不同的种子文件的。
计算的具体范围是从info字段开始(不包含"info"这四个字节),一直到nodes字段为止(不包含"nodes"这5个字节和nodes前边表示nodes字段长度的"5:"这两个字节)。另外,INFO_HASH值是即时计算的,并不包含在Torrent文件中。
nodes:最后的一个字段是nodes字段,这个字段包含一系列ip和相应端口的列表,是用于连接DHT初始node。
综上,多文件Torrent的结构的树形图为:
Multi-file Torrent
├─announce
├─announce-list
├─comment
├─comment.utf-8
├─creation date
├─encoding
├─info
│ ├─files
│ │ ├─length
│ │ ├─path
│ │ └─path.utf-8
│ ├─name
│ ├─name.utf-8
│ ├─piece length
│ ├─pieces
│ ├─publisher
│ ├─publisher-url
│ ├─publisher-url.utf-8
│ └─publisher.utf-8
└─nodes
单文件Torrent的结构的树形图为:
Single-File Torrent
├─announce
├─announce-list
├─comment
├─comment.utf-8
├─creation date
├─encoding
├─info
│ ├─length
│ ├─name
│ ├─name.utf-8
│ ├─piece length
│ ├─pieces
│ ├─publisher
│ ├─publisher-url
│ ├─publisher-url.utf-8
│ └─publisher.utf-8
└─nodes
BT类库文件简码:
//B编码支持的数据类型
TDxBenValueTypes = (DBV_String,DBV_Int,DBV_List,DBV_Dictionary);
//B编码的节点,类似于JSON节点,
TDxBenValue = class
private
FParent: TDxBenValue;
protected
function GetType:TDxBenValueTypes; virtual; abstract;
procedure Parser(str: string);virtual;abstract;
function GetAsInteger: Integer;virtual;abstract;
function GetAsString: string;virtual;abstract;
function GetObject: TDxBenValue;virtual;
public
constructor Create;overload;virtual;
constructor Create(str: string);overload;virtual;
property ValueType: TDxBenValueTypes read GetType;
function ToString: string;override;
property Parent: TDxBenValue read FParent;
property AsInteger: Integer read GetAsInteger;
property AsString: string read GetAsString;
property AsValueObject: TDxBenValue read GetObject;
end;
TDxBenInt = class(TDxBenValue)
private
FValue: Integer;
protected
function GetType:TDxBenValueTypes;override;
function GetAsInteger: Integer;override;
procedure Parser(str: string);override;
function GetAsString: string;override;
function GetObject: TDxBenValue;override;
public
constructor Create;override;
function ToString: string;override;
end;
TDxBenString = class(TDxBenValue)
private
FValue: string;
protected
function GetType:TDxBenValueTypes;override;
function GetAsString: string;override;
function GetObject: TDxBenValue;override;
function GetAsInteger: Integer;override;
procedure Parser(str: string);override;
public
function ToString: string;override;
end;
TDxBenDictionary = class;
TDxBenList = class(TDxBenValue)
private
FList: TList;
function GetCount: Integer;
function GetValues(index: Integer): TDxBenValue;
protected
procedure Parser(str: string);override;
procedure ParserToList(var P: Pchar;List: TDxBenList);
procedure ParserToDictionary(var p: PChar;Dict: TDxBenDictionary);
function GetType:TDxBenValueTypes;override;
function GetAsString: string;override;
function GetObject: TDxBenValue;override;
function GetAsInteger: Integer;override;
public
procedure Clear;
constructor Create; override;
constructor CreateFromString(str: string);
destructor Destroy;override;
function ToString: string;override;
property Count: Integer read GetCount;
property Values[index: Integer]: TDxBenValue read GetValues;
end;
TDxBenDictionary = class(TDxBenValue)
private
FDict: TDictionary<string,TDxBenValue>;
function GetCount: Integer;
function GetValues(Key: string): TDxBenValue;
protected
procedure ParserToList(var P: Pchar;List: TDxBenList);
procedure ParserToDictionary(var p: PChar;Dict: TDxBenDictionary);
procedure Parser(str: string);override;
function GetType:TDxBenValueTypes;override;
function GetAsString: string;override;
function GetObject: TDxBenValue;override;
function GetAsInteger: Integer;override;
public
procedure Clear;
constructor Create;override;
destructor Destroy;override;
function ToString: string;override;
property Count: Integer read GetCount;
property Values[Key: string]: TDxBenValue read GetValues;
end;
TDxBtInfo = class(TDxBenDictionary)
private
function GetSingleFile: Boolean;
function GetFiles: TDxBenList;
function GetName: string;
function GetNameUtf8: string;
function Getpublisher: string;
function GetpublisherUtf8: string;
function Getpublisherurl: string;
function GetpublisherurlUtf8: string;
public
property SingleFile: Boolean read GetSingleFile;
property Files: TDxBenList read GetFiles;
property Name: string read GetName;
property NameUtf8: string read GetNameUtf8;
property publisher: string read Getpublisher;
property publisherUtf8: string read GetpublisherUtf8;
property publisherurl: string read Getpublisherurl;
property publisherurlUtf8: string read GetpublisherurlUtf8;
end;
TDxTorrentFile = class
private
FDict: TDxBenDictionary;
procedure ParserStream(Stream: TStream;Dict: TDxBenDictionary);overload;
procedure ParserStreamToList(Stream: TStream; List: TDxBenList);
function GetComment: string;
function GetEncoding: string;
function GetCreator: string;
function Getannounce: string;
function Getannounce_list: TDxBenList;
function GetBtInfo: TDxBtInfo;
function GetCreateDate: TDateTime;
public
procedure Clear;
constructor Create;
destructor Destroy;override;
procedure LoadFromFile(FileName: string);
procedure LoadFromStream(Stream: TStream);
property Comment: string read GetComment;
property Encoding: string read GetEncoding;
property Creator: string read GetCreator;
property announce: string read Getannounce;
property announce_list: TDxBenList read Getannounce_list;
property BtInfo: TDxBtInfo read GetBtInfo;
property CreateDate: TDateTime read GetCreateDate;
end;
implementation
end.
分享到:
相关推荐
下面将详细阐述BT种子文件的工作原理、包含的信息,以及如何用PHP来解析和计算BT种子的哈希值。 首先,BT种子(.torrent file)是BitTorrent协议的一部分,它包含了关于文件分发的所有必要信息,如文件列表、文件...
这个"BT协议种子解析浏览器"是一个工具,能够帮助用户理解并分析BT种子文件的内部结构,对于学习和研究BT协议的新手来说非常有帮助。 首先,我们来了解BT种子文件的基本构成。种子文件主要包括以下几部分: 1. **...
这个东西主要涉及字符操作,网上有一份C语言格式的源代码,这份代码是我借助那份代码写出来的,具体源代码已经找不到了,有兴趣的自己可以去搜索下。没分类哇,自己写的东西要几分不过分吧!
### BT协议库libtorrent的种子文件解析方法探究 #### 摘要 本文主要探讨了BT协议库libtorrent中种子文件解析的方法。首先简要介绍了P2P通信模式的网络架构,随后深入分析了BitTorrent协议的核心组成部分以及工作...
BT种子解析器是一种用于处理BT(BitTorrent)协议的软件工具,主要功能是解析BT种子文件,以便获取其中包含的元信息,如Tracker服务器地址、文件列表、参与下载的用户哈希等。C++是一种通用的、面向对象的编程语言,...
Java解析BT torrent种子文件是一项常见的任务,特别是在P2P网络编程中。BT(BitTorrent)是一种流行的文件分发协议,而torrent文件则是BT系统中用于存储元数据的文件,包括文件名、文件大小、参与共享的服务器...
在C#中生成BT种子,即torrent文件,主要涉及到对文件内容进行哈希计算和使用Bencode编码格式来组织数据。Bencode是一种用于编码 torrent 文件的简单格式,它包括字符串、整数、列表和字典等类型。在这个过程中,我们...
Linux下的BT种子解析模块主要涉及的是BitTorrent协议的原理、B编码的理解以及种子文件的结构。BitTorrent协议是一种文件分发协议,它通过利用每个下载者的上传带宽,实现了越多人下载速度越快的效果,有效地缓解了...
这些客户端可以解析BT种子文件,管理下载任务,并与其他用户交换数据块。在ARM设备上,我们需要确保这些客户端是为ARM架构优化的,或者能够兼容该架构的交叉编译版本。 为了在嵌入式系统上流畅地播放视频,还需要...
总的来说,通过使用B编码编辑器,我们可以对无法正常下载的BT种子文件进行修复,从而使迅雷等下载工具能够成功下载资源。这种方法对于处理网络上那些因各种原因而无法正常下载的文件非常有用,但也需要一定的技术...
磁力链接则是BT文件的一种无损表示方式,通过哈希值唯一标识一个BT种子,不依赖于.torrent文件本身。 在易语言中实现BT文件解析,我们需要关注以下几点: 1. **文件读取**:首先,你需要使用易语言的文件操作命令...
标题中的“如何把BT种子隐藏在图片内”指的是利用特殊的技术将BT种子文件嵌入到图片文件中,使得种子文件不被轻易发现。这一过程通常用于保护隐私、防止文件被误删或者提供一种隐蔽的数据传输方式。描述进一步指出,...
种子是B编码的,该python代码解析了B编码的种子,将里面的tracker等信息保存下来
1. **解析种子文件**:首先,我们需要读取BT种子文件(.torrent),它包含了关于文件的元数据,如文件名、大小、片块信息以及追踪器服务器列表。这通常可以通过解析种子文件中的`info`部分完成,这部分包含用Base16...
在描述中提到的“使用BT种子下载实例,经过编译,可以使用”,这表明存在一个已经编译完成的C++程序,它可以处理BT种子文件,启动并管理BT下载过程。这个程序可能包括了BT协议的关键组件,如对.torrent文件的解析、...
7. **在线工具提示**:脚本的末尾提到,作者还推荐了一个在线工具,用于将BT种子文件转换为磁力链接,这在某些情况下可能会很有用,例如,当用户需要在没有种子文件的情况下共享资源时。 总的来说,这段代码提供了...
它用于编码和解码BT种子文件中的信息。 - 下载`bencode`模块源码包并安装: ```bash # tar -zxvf bencode-1.0.tar.gz # cd bencode-1.0 # python setup.py install ``` #### 三、制作BT种子并获取信息 一旦...
BT种子程序的核心功能包括生成和解析.torrent文件,以及参与BT网络中的数据交换。以下是对这些关键知识点的详细解释: 1. **torrent文件**:这是BT协议中用于描述文件分发的元数据文件,包含了文件的大小、分块信息...
- **种子文件分析**: - 从望江PT下载一个种子文件,如:[06.06][10-11赛季NBA总决赛G3 小牛VS热火][RMVB][BesTV国语].torrent。 - 使用16进制编辑器以UTF-8模式打开种子文件,可以清晰地看到文件包含的关键信息。...
BT种子爬虫是一种自动化工具,用于在网络上搜索并收集BT(BitTorrent)种子文件信息,这些信息通常包括文件名、大小、磁力链接以及相关信息。PHP作为一种广泛应用的服务器端脚本语言,因其灵活性和易用性而常被用于...