سؤال

أحاول استخدام هذه المكتبة: 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) في نهايةالمطاف.

لا يمكنك استبدال بايت واحد من سلسلة ، ولكن يمكنك تحويلها إلى قائمة بالأحرف ، واستبدال عنصر واحد ، ثم تحويله مرة أخرى.

نصائح أخرى

في بيثون ، السلاسل غير قابلة للتغيير. أنت تمر للعمل 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 أوقات-ولكن ، فكر في مدى كلفك شراء آلة أسرع أربع مرات من الجهاز الحالي ، وربما توافق على أن السرعة حتى السرعة لا تزال الأمور من خلال "Just" 4+ مرات ، بدلاً من 7+ مرات ، من الناتج الثانوي في الوقت نفسه ؛-).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top