Вопрос

Я пытаюсь использовать эту библиотеку: 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