您的位置:首页 > 编程语言 > Python开发

BT源码阅读兼移植一:种子文件编码

2010-01-21 17:26 351 查看
几点声明:

1.由于工作原因,好久不能编写代码了,因此这份工作纯属业余爱好,因此文章水平必定很凹。

2.写这些博文完全是为了记录自己的心得,好脑子不如烂笔头子。

3.如果您不幸进来,觉得写得太烂,sorry,浪费您时间了,就请不要回复了;如果想一起讨论或者给与指教,小弟非常感谢!

 

主要目标:一年内读完BT的PYTHON源码(4.4版本),并且转移到C#上去。

其它目标:深入学习一下PYTHON,回锅一下Csharp和网络编程。

细化:每周抽出5~10小时来完成部分工作,每周必须有进展。

 

为什么看BT代码?:代码太老了,实用价值说实在的不大,但是因为它快绝种鸟。纪念一下。

为什么读python的源码?:因为代码少。

为什么写成C#?:因为C++和Java上都有现成的了,说实在的自己也喜欢C#,因为挺简单(看了几天python,已经觉得python更简单鸟。。。。。)。

 

开始正文:

思路:用BT下载得先下载个种子,先看看种子怎么做的。

     从BT的源码中找到了两个文件 maketorrent.py  和 maketorrent-console.py。两个都能做种子,区别就是第一个带图形界面,第二个是控制台的。

      先看控制台的(简单),结果发现都是调用Bittorrent/makematafle.py中的函数来生成种子。总的思路就是将文件切片后用sha1取得摘要,摘要和目录结构、TrackerUrl等信息编码后生成一个文件。这种编码就是bencoding

 

bencoding 是bt作者自定义的一种格式

可以查看BT官方协议的bencoding部分:http://wiki.theory.org/BitTorrentSpecification

也可以看另一个哥们的blog :http://bbs.soft456.com/read.php?tid=537

------------------------------转载部分----------------------------------------------------------------------

BT种子文件 bencoding编码详细解析
BT种子文件使用了一种叫bencoding的编码方法来保存数据。
bencoding现有四种类型的数据:srings(字符串),integers(整数),lists(列表),dictionaries(字典)

编码规则如下:
strings(字符串)编码为:<字符串长度>:<字符串>
例如: 4:test 表示为字符串"test"
4:例子 表示为字符串“例子”
字符串长度单位为字节
没开始或结束标记

integers(整数)编码为:i<整数>e
开始标记i,结束标记为e
例如: i1234e 表示为整数1234
i-1234e 表示为整数-1234
整数没有大小限制
i0e 表示为整数0
i-0e 为非法
以0开头的为非法如: i01234e 为非法

lists(列表)编码为:l<bencoding编码类型>e
开始标记为l,结束标记为e
列表里可以包含任何bencoding编码类型,包括整数,字符串,列表,字典。
例如: l4:test5abcdee 表示为二个字符串["test","abcde"]

dictionaries(字典)编码为d<bencoding字符串><bencoding编码类型>e
开始标记为d,结束标记为e
关键字必须为bencoding字符串
值可以为任何bencoding编码类型
例如: d3:agei20ee 表示为{"age"=20}
d4:path3:C:/8:filename8:test.txte 表示为{"path"="C:/","filename"="test.txt"}

具体文件结构如下:
全部内容必须都为bencoding编码类型。
整个文件为一个字典结构,包含如下关键字
announce:tracker服务器的URL(字符串)
announce-list(可选):备用tracker服务器列表(列表)
creation date(可选):种子创建的时间,Unix标准时间格式,从1970 1月1日 00:00:00到创建时间的秒数(整数)
comment(可选):备注(字符串)
created by(可选):创建人或创建程序的信息(字符串)
info:一个字典结构,包含文件的主要信息,为分二种情况:单文件结构或多文件结构
单文件结构如下:
      length:文件长度,单位字节(整数)
      md5sum(可选):长32个字符的文件的MD5校验和,BT不使用这个值,只是为了兼容一些程序所保留!(字符串)
      name:文件名(字符串)
      piece length:每个块的大小,单位字节(整数)
      pieces:每个块的20个字节的SHA1 Hash的值(二进制格式)
多文件结构如下:
      files:一个字典结构
          length:文件长度,单位字节(整数)
          md5sum(可选):同单文件结构中相同
          path:文件的路径和名字,是一个列表结构,如/test/test.txt 列表为l4:test8test.txte
      name:最上层的目录名字(字符串)
      piece length:同单文件结构中相同
      pieces:同单文件结构中相同
实例:
用记事本打开一个.torrent可以看来类似如下内容
d8:announce35:http://www.manfen.net:7802/announce13:creation datei1076675108e4:infod6:lengthi17799e4:name62:MICROSOFT.WINDOWS.2000.AND.NT4.SOURCE.CODE-SCENELEADER.torrent12:piece lengthi32768e6:pieces20:?W ??躐?緕排T酆ee

很容易看出
announce=http://www.manfen.net:7802/announce
creation date=1076675108秒(02/13/04 20:25:08)
文件名=MICROSOFT.WINDOWS.2000.AND.NT4.SOURCE.CODE-SCENELEADER.torrent
文件大小=17799字节
文件块大小=32768字节

------------------------------------------转载完毕--------------------------------------------------------------------

好了,bencoding挺简单的。不过移植存在1个问题。那就是list和dictionary在C#中对应什么?

 

从某种意义上说,bencoding 其实是一个语言相关的协议,list和dictionary作为python的标准类型做到了极致。操作起来太简单了!C#中则不会那么得心应手。

 

跑题:不得不说,python的无类型做的太easy了。无类型用起来真的很high,读起来则有些难受
4000
,并且产生潜在错误的可能性也高了不少(C#强调类型安全还是有一定道理的)。这也是很多人讨厌python的原因。不过,我觉得,语言的种类对可读性的影响并不是最大的,关键是编程者的素质了。 

举个例子:

python 的 list类型:可以看做一个容器跟C#的List 或者Arraylist一样,可以理解为一个异构的链表或者异构数组。下面给出它的一个初始化例子

alist=[123,'abc',['cat','dog'],1+2j]

 

List 或者ArrayList就没有那么容易鸟,得调用Add方法一个一个加了,这样的细节还有很多。(哪位大侠有更好的方法。)

跑题完毕。

思路:映射办法

python             C#

int                    int

string               string

list                   Arraylist (感觉比List好用)

dictionary        Dictionary<,>

oh。。。下班一个小时啦。老婆催吃饭,回家了。下次给出代码。

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bt python dictionary c# list path