2

数日間解決しようとした本当に厄介な問題があります。ネットで調べても情報がありません。

ドキュメントを参照して、自分で解決しようとしました。しかし、何も機能しません。

私の問題は

関数で変数を割り当てるXと、使用するたびに同じになるはずです。RandMAC()X

のように X = RandMAC()XAA: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

よろしくお願いします。

4

2 に答える 2

3

RandMACはクラスであり、呼び出すとRandMAC()、そのクラスのインスタンスが得られます。scapyにはこれらのクラスがたくさんありRandXXXXX、それらはすべて同じように動作します。クラスのインスタンスは、実際には一種のランダムなもの生成器であり、固定された (しかしランダムに選択された) ものではありません。この例では、 aは 6 つのRandMacから構築され、値が要求されるたびに a は 0 から 255 までのランダムな値に変わります。RandByteRandByte

私が思うに、その考えは、(たとえば) IP パケットのランダマイザを簡単に構築できるようにすることです。これは、パケットごとにいくつかのフィールドがランダムに選択されることを除いて、すべて同じ IP パケットを提供します。

とにかく、ランダムなもののオブジェクトに対する多くの操作は、それらを「修正」した結果 (つまり、特定のランダムな値を選択すること) に効果的に委譲されます。volatile.pyソースコードを参照してくださいVolatileValue。メソッドで魔法が起こり__getattr__ます。特に、これは via の文字列化に適用されます__str__。これはstr()、Lycha によって観測されたものとprint、Karun S によって観測されたものです。

単一のランダム値を取得したい場合、正しい方法に最も近いのは、おそらく次の_fixメソッドを呼び出すことですX = RandMAC()._fix()strこれはたまたまforと同じRandMACですが、たとえばランダムな整数がある_fix場合、 は実際の整数を返し、strはその文字列表現を返します。

None of this appears to be documented. Don't make any large bets on it still working in future versions. (But, for what it's worth, volatile.py hasn't changed for about two years.)

于 2012-05-20T09:42:19.583 に答える
1

RandMacこれを他の方法で行う方法があるかどうかはわかりませんがX、を文字列に変換することはできます。そうすれば、同じままになります。あなたのコードXでは、実際に毎回関数を呼び出します。

X = str(RandMAC())
print X
print X
print X
于 2012-05-20T09:01:50.787 に答える