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

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

我不知道您继承的 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 回答
1

我猜你想要做的是根据你用'getfield'解析的原始数据输入更改第一个BitField的名称?有点难说...

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

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

祝你好运

于 2015-01-16T08:26:39.560 回答