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に文字列、引数名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

Aは、ここで実際に必要listな構造よりもはるかに一般的な構造であるため、間違ったデータ構造を選択すると7倍以上の速度低下が発生します。array.array(Python 2.7ではそれほどひどくはなく、「たった」4倍以上の速度低下ですが、現在のマシンの4倍の速度でマシンを購入するのにどれだけの費用がかかるかを考えてみてください。おそらく、スピードを上げることにも同意するでしょう。 7回以上ではなく、「ちょうど」4回以上の増加は、依然として十分に価値のある副産物です;-)。

于 2010-08-15T03:16:13.580 に答える
2

の代わりにpack = packet[:]、を使用しpack = list(packet)return ''.join(pack)最後に。

文字列の1バイトを置き換えることはできませんが、文字列のリストに変換し、1つの項目を置き換えてから、元に戻すことはできます。

于 2010-08-15T03:12:46.023 に答える