近期搞项目中遇到Bencode解码的问题,就用Py写了个Bencode解码的代码。作为笔记保存参考。

BEncoding是BitTorrent用在传输数据结构的编码方式,这种编码方式支持四种类型的数据:string, int, Dictionary, List,各自的编码规则如下:

string类型的编码格式为[length]:[string]。以字符串的长度开头,加一个冒号,并以字符串内容结束。示例:"abc" => 3:abc

int类型的编码格式为i[int]e。以i开头,加上数字,以e结尾。 示例:123 => i123e

List类型的编码格式为l[object]e。以l开头,加上列表中各个元素的编码(元素的类型同样为BEncoding支持的类型),以e结尾。 示例:List<"abc", 123> => l3:abci123ee

Dictionary类型的编码格式为d[Key-Value Pair]e。以d开头,加上字典中每个键值对的编码,以e结尾。

# 解析List类型,例:l3:abci123ee => List<"abc", 123>

def decode_list(str,p):

l = len(str)

# print(l)

# print(p)

list = []

while p < l:

if str[p + 1].isdigit():

f_m = str.index(":",p + 1,l)

f_n = int(str[p + 1:f_m])

f_e = f_m + f_n

data_str = str[f_m + 1:f_e + 1]

list.append(data_str)

p = f_e

elif str[p + 1] == "i":

end = str.index("e", p + 1, l)

data_int = str[p + 2: int(end)]

list.append(data_int)

p = end

elif str[p + 1] == "e":

p = p + 2

list.append("p")

list.append(p)

break

elif str[p + 1] == "l":

p = p + 1

return list

# 解析Dictionary类型,例:d4:name11:create chen3:agei23ee => Dictionary<{"name":"create chen"},{"age":23}>

def decode_dict(str,p):

test = decode_list(str,p)

data_seq = []

data_val = []

i = 0

while i < len(test):

data_seq.append(test[i])

data_val.append(test[i + 1])

i = i + 2

data_dict = dict.fromkeys(data_seq)

i = 0

while i < len(test) / 2:

data_dict[data_seq[i]] = data_val[i]

i = i + 1

return data_dict

data = "d4:name11:create chen3:agei23eel3:abci123eei23e3:age"

print(data)

# 定义全局指针,追踪所查位置

global p

l = len(data)

p = 0

while p < l:

# 判断是否为dict型

if data[p] == "d":

data_dict = decode_dict(data,p)

p = int(data_dict["p"])

del data_dict["p"]

print(data_dict)

f = open("text.txt","a+")

for k, v in data_dict.items():

f.write(k + ":" + str(v))

f.write("\n")

f.close()

# 判断是否为list型

elif data[p] == "l":

data_list = decode_list(data,p)

p = int(data_list[-1])

del data_list[-1]

del data_list[-1]

print(data_list)

f = open("text.txt", "a+")

for i in data_list:

f.write(i)

f.write("\n")

f.close()

# 判断是否为str型,解析

elif data[p] == "i":

f = data.index("e",p,l)

data_int = data[p + 1:f]

p = f + 1

print(data_int)

f = open("text.txt", "a+")

f.write(data_int)

f.write("\n")

f.close()

# 判断是否为int型,解析(为了方便,暂未将其结果转为int型,而是str型,例:“123”

elif data[p].isdigit():

f = data.index(":",p,l)

print(data[f])

data_str = data[f + 1:int(data[p:f]) + f + 1]

print(data_str)

p = int(data[p:f]) + f + 1

f = open("text.txt", "a+")

f.write(data_str)

f.write("\n")

f.close()

print("It's done")

python圆柱体积代码_python实现Bencode解码方法相关推荐

  1. python圆柱体积代码_python:表示环绕自身的方形网格(圆柱体)

    我正在建模围绕自身缠绕的正方形网格上发生的某些事情(即,如果您走过最高点,则最终到达最低点,就像圆柱一样:如果走到右边,则只是碰到了边界).我需要跟踪各种代理的位置,不同点上的资源量,并根据某些规则计 ...

  2. chatgpt赋能python:Python圆柱体积计算器:简单、高效、快速解决计算难题

    Python圆柱体积计算器:简单.高效.快速解决计算难题 圆柱体积是一个在日常生活.工程学.数学等领域都十分普遍的概念,可以用来计算许多实际问题中的体积,比如容器的容量.建筑材料的用量等等.在本文中, ...

  3. python编码格式有哪些_Python JSON编解码的方式有哪些

    Python JSON编解码的方式有哪些 发布时间:2020-11-04 17:52:46 来源:亿速云 阅读:92 今天就跟大家聊聊有关Python JSON编解码的方式有哪些,可能很多人都不太了解 ...

  4. python写前端代码_python学习之路前端-JavaScript

    JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...

  5. python阶乘的代码_python编码阶乘

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 需求:阶乘:也是数学里的一种术语: 阶乘指从1乘以2乘以3乘以4一直乘到所要求的 ...

  6. python三角网格代码_Python 实现 Delaunay Triangulation

    Delaunay Triangulation 是一种空间划分的方法,它能使得分割形成的三角形最小的角尽可能的大,关于 Delaunay Triangulation 的详细介绍,请参考这里,Delaun ...

  7. python求平方根的代码_Python求解平方根的方法

    本文实例讲述了Python求解平方根的方法.分享给大家供大家参考.具体如下: 主要通过SICP的内容改写而来.基于newton method求解平方根.代码如下: #!/usr/bin/python ...

  8. python 分位数计算代码_Python数据分析第十一节 数据运算

    数据运算不仅仅是加减乘除的基本运算,还要包括数据的比较,汇总和相关性的计算等等,这一节我们将计算的问题帮大家汇总出来- 目录 一. 加减乘除运算 二. 比较运算 三. 汇总运算 count 非空值计数 ...

  9. python视频处理代码_python如何实现视频转代码视频

    本文实例为大家分享了python如何实现视频转代码视频的具体代码,供大家参考,具体内容如下 # -*- coding:utf-8 -*- #coding:utf-8 import argparse i ...

最新文章

  1. ES6 判断是否为空对象
  2. 在物理学的语言里,“生命”是什么?
  3. 多花5美元提速500%,树莓派新品Zero 2 W发布
  4. SQL Server 行列转换(1)
  5. 构建强化学习_如何构建强化学习项目(第1部分)
  6. JMeter3.0_插件管理
  7. js正整数正则表达式
  8. 分布式通信协议RPC协议简介
  9. 基于vue(element ui) + ssm + shiro 的权限框架
  10. ChengDu University Mental Health Test 需求分析文档
  11. java游戏开发总结_java--游戏后端--项目开发总结6--资源下载
  12. H5利用JS调用摄像头实现拍照效果
  13. 怎样知道android的手机号码,怎么知道自己的手机号
  14. 常见软件项目开发模式思考
  15. 联想拯救者R720重装Win10系统的正确姿势
  16. [Leetcode学习-java]Additive Number
  17. (C++)“韩信点兵”问题的求解方法
  18. 微服务商城系统(十) Spring Security Oauth2 + JWT 用户认证
  19. idea上最好用的小说插件--chapter_reader(不好用你锤死我)
  20. C/C++中strstr()函数:返回字符串中首次出现子串的地址

热门文章

  1. mysql多值存储过程_mysql使用存储过程回来多个值
  2. cjuiautocomplete ajax,Yii CJuiAutoComplete小部件:空响应消息事件
  3. altium pcb 信号高亮_作为PCB工程师,你需要了解这几个设计指南
  4. Mac 配置PHP运行环境
  5. 【BZOJ4991】我也不知道题目名字是什么(线段树)
  6. python——周边
  7. PAT-BASIC-1001-害死人不偿命的(3n+1)猜想
  8. 女生看了别怨我啊!!!!
  9. 如何在 Linux 上检查可用磁盘空间 [终端和 GUI]
  10. emacs自动连接mysql数据库