我正在尝试使用此库: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)
实际上回归:
Traceback (most recent call last):
File "test.py", line 14, in <module>
print onerand(test)
File "test.py", line 7, in onerand
pack[choice(range(len(packet)))]= byte
TypeError: 'str' object does not support item assignment
那么我应该怎么做才能在测试参数上使用该函数?
谢谢!
答案 0 :(得分:3)
在Python中,字符串是不可变的。您传递给函数onerand
一个字符串,参数名称packet
,复制它给出一个本地名称pack
(仍然是一个字符串,仍然是不可变的),然后你尝试做
pack[whatever] = byte
索引无关紧要:您正在尝试修改不可变字符串。这就是错误信息告诉你的内容,在我看来尽可能清楚:你不能这样做。
我不想分裂所有数组 字节
如果您需要分配其中一些字符串,那么您肯定无法使用字符串。无论如何,你对数组有什么看法? import array
,使用pack = array.array('c', packet)
代替pack = packet[:]
,并且永远幸福地生活 - array.array
非常紧凑和快速,和也是可变的!
编辑:您可以使用列表执行此操作,就像在已接受的答案中一样,但这只是在相对成本上相当陡峭。例如,考虑一下:
$ py26 -mtimeit -s's="".join([str(x)[0] for x in range(99)]); import array
> ' 'a=array.array("c",s); a[23]="b"; b=a.tostring()'
1000000 loops, best of 3: 1.09 usec per loop
$ py26 -mtimeit -s's="".join([str(x)[0] for x in range(99)]); import array
> ' 'a=list(s); a[23]="b"; b="".join(a)'
100000 loops, best of 3: 7.68 usec per loop
list
是一个比你真正需要的array.array
更通用的结构,因为选择错误的数据结构的速度超过7倍。 (在Python 2.7中它不那么糟糕,“只有”4倍以上的减速 - 但是,想想购买一台机器比现在快4倍的成本是多少,也许你会同意甚至加速“只是”4次以上,而不是7次以上,仍然是一个非常值得的副产品; - )。
答案 1 :(得分:2)
而不是pack = packet[:]
,最后使用pack = list(packet)
,然后使用return ''.join(pack)
。
您无法替换字符串的单个字节,但您可以将其转换为字符列表,替换一个项目,然后转换回来。