我试图使用这个库:http://pastebin.com/xgPXpGtw(使用示例:http://pastebin.com/fNFAW3Fh) 我有一些问题,因为我不想像他那样把所有字节都拆分成一个数组。
我的测试脚本如下所示:
import random
from random import *
def onerand(packet):
pack = packet[:]
byte = str(chr(choice(range(256))))
pack[choice(range(len(packet)))]= byte
print "fuzzing rand byte:%s\n" % (byte.encode("hex"))
return pack
test = "\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63"
while True:
print onerand(test)
实际返回:
^{pr2}$那么我该怎么做才能在测试参数上使用这个函数呢?
谢谢!
在Python中,字符串是不可变的。您向函数
onerand
传递一个字符串,参数名packet
,复制它并给出一个本地名称pack
(仍然是一个字符串,因此仍然是不可变的),然后您尝试这样做索引并不重要:您正在尝试修改不可变的字符串。这就是错误信息告诉你的,在我看来,这是尽可能清楚的:你不能这样做。在
如果你需要分配一些字符串,那么你肯定不能使用字符串。你对数组有什么看法?}非常紧凑和快速,和也是可变的!在
import array
,用pack = array.array('c', packet)
代替pack = packet[:]
,从此以后{编辑:你可以用一个列表来完成,就像在公认的答案中那样,但这只是在性能上付出了非常大的相对代价。例如,考虑一下:
^{pr2}$list
是一个比这里真正需要的array.array
更一般的结构,在这里选择错误的数据结构会慢7倍多。(Python2.7没有那么可怕,“只是”减速了4倍多,但是,想想买一台比现在快4倍的机器要花多少钱,也许你会同意,即使把速度“仅仅”提高4倍而不是7倍,仍然是一个很值得的副产品;-)。在不要使用
pack = packet[:]
,而是使用pack = list(packet)
,然后在末尾使用return ''.join(pack)
。在不能替换字符串的单个字节,但可以将其转换为字符列表,替换一个项,然后再转换回原来的值。在
相关问题 更多 >
编程相关推荐