Frage

Ich versuche, diese Bibliothek zu verwenden: http://pastebin.com/xgPXpGtw (ein Beispiel Verwendung: http://pastebin.com/fNFAW3Fh ) Ich habe einige Probleme, da ich in einem Array alle Byte Split nicht wollen, wie er.

Ihr Testskript sieht wie folgt aus:

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)

Und tatsächlich zurückkehrt:

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

Also, was soll ich tun, der Lage sein, diese Funktion auf die Testparameter zu benutzen?

Danke!

War es hilfreich?

Lösung

statt pack = packet[:], Verwendung pack = list(packet) und dann return ''.join(pack) am Ende.

Sie können nicht ein einziges Byte einer Zeichenfolge ersetzen, aber man kann es auf eine Liste von Zeichen konvertieren, ersetzen Sie ein Element, und dann konvertieren zurück.

Andere Tipps

In Python sind Strings unveränderlich. Sie passieren zu Funktion onerand eine Zeichenfolge, Argument Name packet, kopieren Sie einen lokalen Namen pack (noch eine Zeichenfolge, nach wie vor damit unveränderlich) geben, dann versuchen Sie zu tun

pack[whatever] = byte

hat der Index keine Rolle: Sie versuchen, die unveränderliche Zeichenfolge zu ändern. Das ist, was die Fehlermeldung Sie, so klar wie möglich erzählt es scheint mir. Sie können das nicht

  

Ich habe nicht alle in einem Array teilen möchte   das Byte

Nun können Sie sicher nicht verwenden, um eine string , wenn Sie einige von ihnen zuweisen müssen. Was haben Sie gegen Arrays eigentlich? import array, Verwendung pack = array.array('c', packet) statt pack = packet[:] und Live für immer glücklich - ein array.array sehr kompakt und schnell, und zu wandelbar

Bearbeiten : Sie könnte tut es mit einer Liste, wie sie in der akzeptierten Antwort, aber das ist nur bei einem wirklich steil relativ Kosten der Leistung. Betrachten wir zum Beispiel:

$ 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

Ein list ist eine viel allgemeinere Struktur als die array.array Sie wirklich hier braucht, von wo aus der Mehr-als-seven-mal Verlangsamung in der falsche Datenstruktur wählen. (Es ist weniger schrecklich in Python 2.7, „nur“ eine 4-fach-plus Verlangsamung - aber denken, wie viel würde es kosten, eine Maschine bis zu viermal schneller als die aktuellen, einem zu kaufen, und vielleicht sehen Sie, dass auch die Beschleunigung zustimmen Dinge von „nur“ 4+ mal, statt 7+ Zeiten, ist immer noch ein gut lohnt Nebenprodukt; -).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top