1

我正在尝试使用这个库: 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

那么我应该怎么做才能在测试参数上使用该功能?

谢谢 !

4

2 回答 2

3

在 Python 中,字符串是不可变的。您将onerand一个字符串参数 name传递给函数packet,将其复制给一个本地名称pack(仍然是一个字符串,因此仍然是不可变的),然后您尝试执行

pack[whatever] = byte

索引无关紧要:您正在尝试修改不可变字符串。这就是错误消息告诉你的内容,在我看来尽可能清楚:你不能那样做。

我不想在一个数组中拆分所有字节

好吧,如果您需要分配其中一些,您肯定不能使用string 。无论如何,您对阵列有什么看法? import array, 使用pack = array.array('c', packet)代替pack = packet[:], 从此过上幸福的生活—— anarray.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

Alist是一个比array.array你真正需要的更通用的结构,因此选择错误的数据结构会慢七倍以上。(在 Python 2.7 中它没那么可怕,“只是”减速了 4 倍以上——但是,想想你买一台比你现在的机器快四倍的机器要花多少钱,也许你会同意即使超速将事情“仅仅”增加 4 次以上,而不是 7 次以上,仍然是一个非常值得的副产品;-)。

于 2010-08-15T03:16:13.580 回答
2

而不是pack = packet[:], 使用pack = list(packet), 然后return ''.join(pack)在最后。

您不能替换字符串的单个字节,但可以将其转换为字符列表,替换一项,然后再转换回来。

于 2010-08-15T03:12:46.023 回答