关于python3中整数数组转bytes的效率问题
来源:互联网 发布:淘宝二手书怎么卖 编辑:程序博客网 时间:2024/06/07 13:42
昨天在做一道CTF题的时候碰到了一个图片异或的问题,操作大概如下:
将一个图片读入,然后每字节进行异或操作,核心代码可简化为以下:
#coding:utf-8'''@DateTime: 2017-11-25 13:51:33@Version: 1.0@Author: Unname_Bao'''import sixkey = b'\xdcd~\xb6^g\x11\xe1U7R\x18!+9d\xdcd~\xb6^g\x11\xe1U7R\x18!+9d'with open('flag.encrypted','rb') as f:c = f.read()flag = b''for i in range(32):flag += six.int2byte(key[i%32]^c[i])with open('flag.png','wb') as f:f.write(flag)
然后就碰到了一个效率问题,跑了十几分钟都没有跑出结果,起初以为是类型转换的问题,因为比较急,于是换了成了C++的代码去解决,后来一直没多想。今天闲下来的时候才发现代码之前的代码中存在一个非常大的问题:内存申请问题。
由于flag.encrypted文件大小为6.47MB之大,由于我的脚本思路是不断在byte数组后添加,但忽略了其本质。就是在内存申请过程中,由于数组长度最终为600+W大小,期间存在多次数组内存不够,需要重新申请内存的问题,而python中的内存申请显然没有C++的vector的push_back有效率。而且python中,无论是list、string还是byte,也没有reserve这种函数,不能预留内存空间(这时候真的要吐槽一下python设计者对速度优化的考量了)。于是只能用另一种方法进行优化,就是先用list申请一个需求大小的内存空间,然后再转为bytes使用,代码如下:
#coding:utf-8'''@DateTime: 2017-11-26 14:09:29@Version: 2.0@Author: Unname_Bao'''key = b'\xdcd~\xb6^g\x11\xe1U7R\x18!+9d\xdcd~\xb6^g\x11\xe1U7R\x18!+9d'with open('flag.encrypted','rb') as f:c = f.read()flag = list('1'*len(c))for i in range(len(c)):flag[i] = key[i%32]^c[i]flag = bytes(flag)with open('flag.png','wb') as f:f.write(flag)
这样写的话几乎是瞬间完成任务了,但还是比C++慢很多,这是不可避免的。
阅读全文
2 0
- 关于python3中整数数组转bytes的效率问题
- 关于python3 Socket.send bytes-Obj 问题
- Python3中 bytes/str的区别
- 关于二维数组循环的效率问题
- Python3中关于中文编码的问题
- python3中关于列表复制的问题
- python3中bytes与string的互相转换
- Python3中bytes和HexStr之间的转换
- python3中bytes与string的互相转换
- python3中bytes与string的互相转换
- Python3中bytes与string的互相转换
- Python3中bytes和HexStr之间的转换
- Python3中bytes与string的互相转换
- python3中bytes和string之间的互相转换
- Python3中bytes和HexStr之间的转换
- python3 bytes、str的区别
- python3环境下 tensorflow环境中经常遇到'*' has type str, but expected one of: bytes问题的解决
- python3中,关于Tkinter中Button参数的问题
- 如果有人问你什么是大数据?不妨说说这10个典型的大数据案例
- 在mac上通过Homebrew安装redis
- Spring Boot运行原理
- C#调用C++ DLL
- 使用github的域名上传个人网站
- 关于python3中整数数组转bytes的效率问题
- 实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定, 输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表。
- 基于bootstrap旅游网站以及高德地图API的使用
- 环境变量
- POJ
- Spring:Aop实现解析
- 泛型
- 目录——Javase第一阶段:基本知识
- 尺取法求解HDU 5672