题
我正在尝试使用此库: 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
那么,我该怎么办才能在测试参数上使用该功能?
谢谢 !
解决方案
代替 pack = packet[:]
, , 采用 pack = list(packet)
, , 进而 return ''.join(pack)
在末尾。
您不能替换字符串的单个字节,但是可以将其转换为字符列表,替换一个项目,然后转换回。
其他提示
在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
您确实需要在这里,从而在选择错误的数据结构时要降低了七个时期的放缓。 (在Python 2.7中不那么可怕,仅“仅” 4倍以上的放缓 - 但是,请考虑您要比当前的机器要花费四倍的速度要花费多少,也许您会同意,即使超速超速“只有4次”,而不是7次以上的事情,但仍然是一个值得一提的副产品;-)。