Python Scapy:将更多字段添加到字段描述

Python Scapy:将更多字段添加到字段描述,python,scapy,packets,Python,Scapy,Packets,我正在尝试创建一个新的协议。问题是,需要将更多字段动态添加到字段描述中,但我不确定如何实现这一点。 在Scapy文档中,我了解到Scapy中的一个层实际上只是一个字段列表,可以对其进行操作,但Scapy似乎不喜欢以下内容: >>> class SomePacket(Packet): ... ... name = "SomePacket" ... fields_desc = [ IntField("Number",0) ] ...

我正在尝试创建一个新的协议。问题是,需要将更多字段动态添加到字段描述中,但我不确定如何实现这一点。 在Scapy文档中,我了解到Scapy中的一个层实际上只是一个字段列表,可以对其进行操作,但Scapy似乎不喜欢以下内容:

>>> class SomePacket(Packet):
...         
...     name = "SomePacket"
...     fields_desc = [ IntField("Number",0) ]
...             
...     def add_IntField(self, name, value):
...         self.fields_desc.append(IntField(name, value))
... 
>>> packet = SomePacket()
>>> ls(packet)
Number     : IntField             = 0               (0)
>>> packet.add_IntField("X",1)
>>> ls(packet)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 1212, in ls
    print "%-10s : %-20s = %-15s (%s)" % (f.name, f.__class__.__name__, repr(getattr(obj,f.name)), repr(f.default))
  File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 176, in __getattr__
    fld,v = self.getfield_and_val(attr)
  File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 172, in getfield_and_val
    return self.payload.getfield_and_val(attr)
  File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 1057, in getfield_and_val
    raise AttributeError(attr)
AttributeError: X
>>> packet = SomePacket()
>>> ls(packet)
Number     : IntField             = 0               (0)
X          : IntField             = 1               (1)
>>类SomePacket(数据包):
...         
...     name=“SomePacket”
...     字段描述=[IntField(“数字”,0)]
...             
...     def add_IntField(自身、名称、值):
...         self.fields_desc.append(IntField(名称、值))
... 
>>>packet=SomePacket()
>>>ls(数据包)
编号:IntField=0(0)
>>>packet.add_IntField(“X”,1)
>>>ls(数据包)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.7/dist packages/scapy/packet.py”,第1212行,ls格式
打印“%-10s:%-20s=%-15s(%s)”%(f.name,f.__类__类__名称_;,repr(getattr(obj,f.name)),repr(f.default))
文件“/usr/lib/python2.7/dist packages/scapy/packet.py”,第176行,在__
fld,v=自身。获取字段和值(属性)
文件“/usr/lib/python2.7/dist packages/scapy/packet.py”,第172行,在getfield_和_val中
返回self.payload.getfield_和_val(attr)
文件“/usr/lib/python2.7/dist packages/scapy/packet.py”,第1057行,在getfield_和_val中
提升属性错误(属性)
属性错误:X
>>>packet=SomePacket()
>>>ls(数据包)
编号:IntField=0(0)
X:IntField=1(1)

因此,当我在添加字段后首次尝试显示数据包内容时,它不起作用。但是,如果我再次创建数据包,属性就会突然出现。我做错了什么?你不应该那样做。当您创建一个新的
SomePacket
对象时,
Packet
函数使用
字段描述列表初始化许多其他内容。向
字段\u desc
动态添加新值会导致不一致,从而产生给定错误

一种解决方案是将
add_IntField
函数更改为
classmethod
,并在创建新对象之前添加所需字段,如下所示:

>>> class SomePacket(Packet):
...         
...     name = "SomePacket"
...     fields_desc = [ IntField("Number",0) ]
...     
...     @classmethod
...     def add_IntField(cls, name, value):
...         cls.fields_desc.append(IntField(name, value))

>>> SomePacket.add_IntField('X', 1)
>>> packet = SomePacket()
>>> ls(packet)
Number     : IntField             = 0               (0)
X          : IntField             = 1               (1)

非常感谢你。这正是我需要的。我甚至不知道
classmethods
,因为我是python新手。