我正在使用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
但似乎没有用。如果你能指出我正确的方向会很酷,不知怎的,我迷路了。
答案 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和类重载效果会更好。
祝你好运