Scapy中如何提取FieldLenField字段的计算值?
Scapy自定义协议中FieldLenField计算值的提取问题
我正在使用Scapy模块构建新协议的数据包。新协议的数据包层结构如下:
- 第一个字段为ID字段
- 随后是取值为新协议负载大小的长度字段
- 接着是MAC地址字段
- 最后是数据负载
我的代码如下:
from scapy.all import * class MyLayer(Packet): name = "MyLayer" fields_desc = [BitField("id", 1, 16), FieldLenField("len", None, length_of = "data"), MACField("MACAddress", "00:00:00:00:00:00"), StrLenField("data", "", length_from = lambda pkt: pkt.len)] myLayer = MyLayer(data = "abcd1234") myLayer.show2()
show2()函数的输出符合预期,但直接通过len属性提取FieldLenField的计算值时,得到的是默认值None:
print(myLayer.len) None
请问提取该字段计算值的正确方法是什么?
解决方案
FieldLenField的动态计算逻辑是延迟触发的,只有当数据包需要被序列化(比如构建、发送或显示)时,Scapy才会根据length_of指定的字段计算实际值。直接访问属性得到的是初始的默认值None,可以通过以下两种方法获取计算后的值:
方法一:调用build()触发字段计算
build()方法会强制Scapy完成数据包的构建,此时动态字段的计算会被执行:
myLayer = MyLayer(data = "abcd1234") myLayer.build() print(myLayer.len) # 输出:8(对应"data"字段的长度)
方法二:使用getfieldval()方法直接获取计算值
Scapy提供的getfieldval()方法会自动触发字段的动态计算,无需提前构建数据包:
myLayer = MyLayer(data = "abcd1234") print(myLayer.getfieldval("len")) # 输出:8
内容的提问来源于stack exchange,提问作者thomas_chang
相关产品推荐
相关产品推荐

