zoukankan      html  css  js  c++  java
  • BT源代码学习心得(三):种子文件的编码方式 转自CSDN:gushenghua的专栏

    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的种子文件就是这样一种复杂的对象(字典类型)。知道编码方
    式后,下次介绍种子文件时,只需要解释这个字典类型包含的每个元素的情况即可,保存成
    文件和从文件中读取的这个过程就不需要再解释了。
  • 相关阅读:
    第一周例行报告
    内置函数_map、filter
    时间戳
    模块_pip、os模块
    常用内置函数
    函数递归、列表推导式
    Python基础(六)_全局变量声明、可变参数、关键字参数
    Python基础(五) 函数
    python基础(四)集合
    Python基础(三)文件操作
  • 原文地址:https://www.cnblogs.com/kokoliu/p/616904.html
Copyright © 2011-2022 走看看