質問
私はこのライブラリを使用しようとしています: 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)
最後に。
文字列の単一のバイトを置き換えることはできませんが、文字列のリストに変換し、1つのアイテムを交換してから、変換することができます。
他のヒント
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
よりはるかに一般的な構造です array.array
ここで本当に必要なのは、間違ったデータ構造を選択する際に7倍以上の減速です。 (Python 2.7では、4倍以上のスローダウンである「唯一の」ではひどくありませんが、現在のマシンよりも4倍速いマシンを購入するのにどれだけの費用がかかるかを考えてください。 「Just」では、7回以上ではなく4回以上のものは、まだ十分な副産物です;-)。