Я пытаюсь добавить поле в пакет с типом, который зависит от другого значения поля. Одним из этих «типов» является строка переменной длины, с дополнительным атрибутом «len», если это применимо.
Рассмотрим следующий пример:
from scapy.all import *
class TestPacket(Packet):
fields_desc=[
ShortField("index", 0),
ByteEnumField("type", 0 , { 1: "String", 2: "Integer" }),
ConditionalField(FieldLenField("len", None, length_of="data"), lambda x: x.type==1),
ConditionalField(StrLenField("data", "", length_from=lambda pkt:pkt.len), lambda x: x.type==7 or x.type==11),
ConditionalField(IntField("data", 1), lambda pkt: pkt.type==2)]
p = TestPacket(index=12, type=1, data="My Sample String")
p.show2()
p = TestPacket(index=13, type=2, data=5)
p.show2()
Проблема в том, что «len» всегда установлен в 4 (длина IntField, так как это последнее условное поле «data»).
Каков наилучший способ для достижения этой функциональности? Условные поля с разными именами? Хранение необработанных байтов в виде строки переменной длины, независимо от типа?