关于python3中整数数组转bytes的效率问题

昨天在做一道CTF题的时候碰到了一个图片异或的问题,操作大概如下:

将一个图片读入,然后每字节进行异或操作,核心代码可简化为以下:

#coding:utf-8
'''
	@DateTime: 	2017-11-25 13:51:33
	@Version: 	1.0
	@Author: 	Unname_Bao
'''
import six
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 = 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++慢很多,这是不可避免的。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值