1

私は scapy を使用しており、scapy だけでなく python にも関連する質問があります。変数をscapyフィールド名として使用しようとしています。これは、私がやろうとしていることを説明するコードの抜粋です(機能していません):

class Test(Packet):
    name = "Test23"
    def __init__(self,foo=None):
        self.foo=foo

    fields_desc = [
                BitField(self.foo, 0x0, 4),
                BitField("bar", 0x3, 4)
                ]

問題は、 fields_desc がクラス変数ではなくクラス属性であるという事実によるものだと思います。では、どうすれば自分の望むものにたどり着けるでしょうか?(実行時/クラスの初期化時に self.foo の名前を設定しますか?)

どんな助けにも感謝します。敬具

編集:カウンターを追加するだけで十分です。私は試した:

class Counter:
     count = 0    
     def __init__(self):
         self.__class__.count += 1 
     foo = [ 
            "lala"+str(count)
            ]   
     print foo 


a=Counter()
a.count
print a.foo
b=Counter()
b.count
print b.foo

しかし、うまくいかないようです。どういうわけか私は道に迷っています。

4

2 に答える 2

1

あなたがしようとしているのは、「getfield」で解析している生データ入力に基づいて最初の BitField の名前を変更することだと思いますか? ちょっと言いにくい…

とにかく、関数からpre_dissect生データを見て、必要に応じてフィールドを self.fields_desc に追加できます。pre_dissect を使用する場合は、変更されていない関数の最後で生のパケット データを返すようにしてください。

私の経験では、これが正しい方法であることはめったにありません。通常、ConditionalField とクラスのオーバーロードは、長期的にははるかにうまく機能します。

幸運を

于 2015-01-16T08:26:39.560 に答える
1

クラスコンストラクターが実行される前にクラス属性が初期化されると思うので、fields_desc が作成されたときに self.foo が割り当てられていません。fields_desc を空の配列として宣言し、__init__関数内で BitField オブジェクトを追加してみてください。

あなたが継承している Packet クラスがどのように機能するかはわかりませんが、super() 関数も参照してください。

編集:多分あなたはこのようなものを探していますか?

class Counter:
    i = 0
    foo = []
    def count(self):
        self.__class__.i += 1
        self.__class__.foo.append(['lala' + str(self.__class__.i)])

a = Counter()
a.count()
print Counter().foo
b = Counter()
b.count()
print Counter().foo

出力

[['lala1']]
[['lala1'], ['lala2']]

クラス変数の詳細はこちら

于 2011-07-19T13:36:28.070 に答える