[转]BT源代码学习心得(三):种子文件的编码方式

发信人: wolfenstein (NeverSayNever), 个人文集
标  题: BT源代码学习心得(三):种子文件的编码方式
发信站: 水木社区 (Mon Aug  1 20:33:37 2005), 文集
(本文包含HTML标记,终端模式下可能无法正确浏览)
    昨天家里居然断了一天网,ft。
    BT的作者使用了一种比较简单易懂的编码方式来对设计种子文件。这种编码方式能够很
简单得对python中的各种数据类型,如字符串,整数,列表,字典等进行编码。而且对于类
型的嵌套,如一个列表中的元素又是一个列表等情况能够进行很好得处理。
    BitTorrent/bencode.py模块负责进行编码解码的工作。函数bencode能够对python的复
杂数据类型进行编码。这个函数的意思难道是BT encode?它通过恰当得递归调用自己来完
成任务。
    首先他判断要编码的数据的类型,然后根据这个类型调用相应的编码函数
encode_func[type(x)],定义了以下类型的编码函数:
    encode_int,负责对IntType和LongType类型进行编码。编码为一个字母"i"加上这个数
值的字符串表示再加上一个字母"e"。就是说整数19851122将会被编码成"i19851122e"存在
文件中。
    encode_string,负责对StringType类型进行编码。编码方式为字符串的长度加上一个
冒号":"再加上字符串本身。例如helloworld将被编码成"10:helloworld"存放在文件中。
    encode_list,负责对ListType和TupleType类型进行编码。编码方式为一个字母"l",
然后递归得调用相应的编码函数将列表或者元组的所有元素进行bencode,最后编上一个
"e"结束。
    encode_dict,负责对DictType类型进行编码。编码方式为一个字母"d",然后递归得对
每个元素进行处理。在DictType中,每个元素都由一个key和value对组成。首先以长度加
":"加实际值的方式编码key,因为key通常都是简单值,所以可以这样编码。然后对value进
行bencode,最后加上一个"e"结束。
    通过分析以上的编码函数我们可以看出,复杂的对象被以此种编码方式进行编码后将能
够无歧义地被还原出来。而BT的种子文件就是这样一种复杂的对象(字典类型)。知道编码方
式后,下次介绍种子文件时,只需要解释这个字典类型包含的每个元素的情况即可,保存成
文件和从文件中读取的这个过程就不需要再解释了。

原文地址:https://www.cnblogs.com/YYi_H/p/1934364.html