質問
本当に厄介な問題があり、それを数日間解決しようとしました。ネット上で情報が見つかりません。
ドキュメントを参照して自分で解決しようとしました。しかし、何も機能しません。
私の問題は
変数を代入するとき X
と RandMAC()
関数、 X
使うたびに同じになるはずです。
のように、 X = RandMAC()
, 、そして言ってみましょう X
今でしょ AA:BB:CC:DD:EE:FF
X を 3 回出力すると、次のようになります。
X = AA:BB:CC:DD:EE:FF
X = AA:BB:CC:DD:EE:FF
X = AA:BB:CC:DD:EE:FF
しかし、コードが実際に行うことは、
X = AA:BB:CC:DD:EE:FF
X = 00:0A:0B:0C:0D:0E:0F
X = 11:22:33:44:55:66
したがって、print X を呼び出すたびに変更されます。
この問題はどうすれば解決できますか?
私のコードは次のとおりです。
from scapy.all import *
X = RandMAC()
print X
print X
print X
皆様、よろしくお願いします。
解決
RandMAC
はクラスであり、呼び出すと RandMAC()
取得するのはそのクラスのインスタンスです。 scapy
これらをたくさん持っています RandXXXXX
クラスであり、それらはすべて同じように動作します。クラスのインスタンスは実際には、固定された (ただしランダムに選択された) ものではなく、一種のランダムなものジェネレーターです。この場合、 RandMac
6 つの要素から構成されています RandByte
と、 RandByte
値が要求されるたびに、0 から 255 までのランダムな値に変わります。
私の考えでは、そのアイデアは、(たとえば) パケットごとにいくつかのフィールドがランダムに選択されることを除いてすべて同じ IP パケットを提供する IP パケット ランダマイザーを簡単に構築できるようにすることです。
したがって、とにかく、ランダムなオブジェクトに対する多くの操作は、それらを「修正」した結果 (つまり、特定のランダムな値を選択したこと) に事実上委任されます。見る volatile.py
ソースコードのクラス内で VolatileValue
;魔法はそこで起こります __getattr__
方法。特に、これは文字列化に当てはまります。 __str__
, 、それは何ですか str()
Lycha が観察したとおりに何をするか print
Karun S が観察したとおりに行います。
単一のランダムな値を取得したい場合、正しい方法に最も近い方法はおそらく、 _fix
方法: X = RandMAC()._fix()
. 。それはたまたま同じです str
のために RandMAC
, 、しかし、例えばランダムな整数がある場合 _fix
実際の整数が得られますが、 str
文字列表現が得られます。
これはどれも文書化されていないようです。将来のバージョンでも動作するかどうかに大きな賭けをしないでください。(しかし、それだけの価値があるのに、 volatile.py
2年くらい変わってないです。)
他のヒント
RandMac
がこのような方法で行う方法があるかどうかわかりませんが、X
を文字列に変換することができます。あなたのコードでX
は実際には毎回機能を呼び出します。
X = str(RandMAC())
print X
print X
print X
.