python圆柱体积代码_python实现Bencode解码方法
近期搞项目中遇到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解码方法相关推荐
- python圆柱体积代码_python:表示环绕自身的方形网格(圆柱体)
我正在建模围绕自身缠绕的正方形网格上发生的某些事情(即,如果您走过最高点,则最终到达最低点,就像圆柱一样:如果走到右边,则只是碰到了边界).我需要跟踪各种代理的位置,不同点上的资源量,并根据某些规则计 ...
- chatgpt赋能python:Python圆柱体积计算器:简单、高效、快速解决计算难题
Python圆柱体积计算器:简单.高效.快速解决计算难题 圆柱体积是一个在日常生活.工程学.数学等领域都十分普遍的概念,可以用来计算许多实际问题中的体积,比如容器的容量.建筑材料的用量等等.在本文中, ...
- python编码格式有哪些_Python JSON编解码的方式有哪些
Python JSON编解码的方式有哪些 发布时间:2020-11-04 17:52:46 来源:亿速云 阅读:92 今天就跟大家聊聊有关Python JSON编解码的方式有哪些,可能很多人都不太了解 ...
- python写前端代码_python学习之路前端-JavaScript
JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...
- python阶乘的代码_python编码阶乘
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 需求:阶乘:也是数学里的一种术语: 阶乘指从1乘以2乘以3乘以4一直乘到所要求的 ...
- python三角网格代码_Python 实现 Delaunay Triangulation
Delaunay Triangulation 是一种空间划分的方法,它能使得分割形成的三角形最小的角尽可能的大,关于 Delaunay Triangulation 的详细介绍,请参考这里,Delaun ...
- python求平方根的代码_Python求解平方根的方法
本文实例讲述了Python求解平方根的方法.分享给大家供大家参考.具体如下: 主要通过SICP的内容改写而来.基于newton method求解平方根.代码如下: #!/usr/bin/python ...
- python 分位数计算代码_Python数据分析第十一节 数据运算
数据运算不仅仅是加减乘除的基本运算,还要包括数据的比较,汇总和相关性的计算等等,这一节我们将计算的问题帮大家汇总出来- 目录 一. 加减乘除运算 二. 比较运算 三. 汇总运算 count 非空值计数 ...
- python视频处理代码_python如何实现视频转代码视频
本文实例为大家分享了python如何实现视频转代码视频的具体代码,供大家参考,具体内容如下 # -*- coding:utf-8 -*- #coding:utf-8 import argparse i ...
最新文章
- ES6 判断是否为空对象
- 在物理学的语言里,“生命”是什么?
- 多花5美元提速500%,树莓派新品Zero 2 W发布
- SQL Server 行列转换(1)
- 构建强化学习_如何构建强化学习项目(第1部分)
- JMeter3.0_插件管理
- js正整数正则表达式
- 分布式通信协议RPC协议简介
- 基于vue(element ui) + ssm + shiro 的权限框架
- ChengDu University Mental Health Test 需求分析文档
- java游戏开发总结_java--游戏后端--项目开发总结6--资源下载
- H5利用JS调用摄像头实现拍照效果
- 怎样知道android的手机号码,怎么知道自己的手机号
- 常见软件项目开发模式思考
- 联想拯救者R720重装Win10系统的正确姿势
- [Leetcode学习-java]Additive Number
- (C++)“韩信点兵”问题的求解方法
- 微服务商城系统(十) Spring Security Oauth2 + JWT 用户认证
- idea上最好用的小说插件--chapter_reader(不好用你锤死我)
- C/C++中strstr()函数:返回字符串中首次出现子串的地址
热门文章
- mysql多值存储过程_mysql使用存储过程回来多个值
- cjuiautocomplete ajax,Yii CJuiAutoComplete小部件:空响应消息事件
- altium pcb 信号高亮_作为PCB工程师,你需要了解这几个设计指南
- Mac 配置PHP运行环境
- 【BZOJ4991】我也不知道题目名字是什么(线段树)
- python——周边
- PAT-BASIC-1001-害死人不偿命的(3n+1)猜想
- 女生看了别怨我啊!!!!
- 如何在 Linux 上检查可用磁盘空间 [终端和 GUI]
- emacs自动连接mysql数据库