Question

Je suis en train d'utiliser cette bibliothèque: http://pastebin.com/xgPXpGtw (un exemple d'utilisation: http://pastebin.com/fNFAW3Fh ) J'ai quelques questions que je ne veux pas que Split dans un tableau tout l'octet comme il le fait.

Mon script de test ressemble à ceci:

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)

Et en fait des retours:

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

Alors, que dois-je faire pour pouvoir utiliser cette fonction sur les paramètres de test?

Merci!

Était-ce utile?

La solution

au lieu de pack = packet[:], utilisez pack = list(packet), puis return ''.join(pack) à la fin.

vous ne pouvez pas remplacer un seul octet d'une chaîne, mais vous pouvez le convertir en une liste de caractères, remplacer un élément, puis reconvertir.

Autres conseils

En Python, les chaînes sont immuables. Vous passez à la fonction onerand une chaîne, packet nom de l'argument, le copier donnant un nom local pack (encore une chaîne, donc toujours immuable), alors vous essayez de faire

pack[whatever] = byte

l'indice n'a pas d'importance: vous essayez de modifier la chaîne immuable. C'est ce que le message d'erreur vous dit aussi clairement que possible, il me semble. Vous ne pouvez pas le faire

  

Je ne veux pas diviser dans un tableau tous   l'octet

Eh bien, vous ne peut certainement pas utiliser un string , si vous avez besoin d'assigner certains d'entre eux. Qu'est-ce que vous avez contre des réseaux, de toute façon? import array, l'utilisation pack = array.array('c', packet) au lieu de pack = packet[:], et vivre heureux pour toujours - un array.array est très compact et rapide, et mutable trop

Modifier : vous peut le faire avec une liste, comme dans la réponse acceptée, mais c'est seulement à un coût relatif vraiment forte performance. Prenons, par exemple:

$ 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

A list est une structure beaucoup plus générale que la array.array vous avez vraiment besoin ici, d'où le ralentissement de plus-que-sept fois dans le choix de la structure de données erronées. (Il est moins terrible dans Python 2.7, « seulement » un 4 fois-plus ralentissement - mais, pensez combien il vous en coûterait pour acheter une machine quatre fois plus vite que votre actuel, et peut-être vous d'accord que la vitesse excessive même les choses par « juste » 4+ fois, au lieu de 7+ fois, est encore un sous-produit bien utile; -.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top