Scapy设置类属性问题

时间:2011-07-19 12:45:43

标签: python scapy

我正在使用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是一个类属性而不是一个类变量。现在,我怎么能达到我想要的? (在运行时/类inizialisation中设置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

但似乎没有用。如果你能指出我正确的方向会很酷,不知怎的,我迷路了。

2 个答案:

答案 0 :(得分:1)

认为类属性在类构造函数运行之前被初始化,因此在创建fields_desc时尚未分配self.foo。尝试将fields_desc声明为空数组,并在__init__函数中将BitField对象附加到它。

我不知道您继承的Packet类是如何工作的,但您可能还想查看super() function

编辑:也许你正在寻找这样的东西?

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']]

有关类变量的更多信息here

答案 1 :(得分:1)

我猜测您要做的是根据您使用' getfield&#39解析的原始数据输入更改第一个BitField的名称;?这很难说......

无论如何,您可以从函数pre_dissect查看原始数据,并根据需要将字段附加到self.fields_desc。使用pre_dissect时,请确保在未修改的函数末尾返回原始数据包数据。

根据我的经验,这很少是正确的方法,从长远来看,通常ConditionalField和类重载效果会更好。

祝你好运