我正在尝试使用此库: 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次以上的事情,但仍然是一个值得一提的副产品;-)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top