Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scapy-添加类型依赖于其他字段的字段_Python_Python 3.x_Scapy - Fatal编程技术网

Python Scapy-添加类型依赖于其他字段的字段

Python Scapy-添加类型依赖于其他字段的字段,python,python-3.x,scapy,Python,Python 3.x,Scapy,我试图将一个字段添加到一个数据包中,该数据包的类型依赖于另一个字段值。 其中一个“类型”是一个var长度字符串,如果适用,还带有一个附加的“len”属性 考虑以下示例: 从scapy.all导入* 类测试包(数据包): 字段_desc=[ 短字段(“索引”,0), ByteEnumField(“类型”,0,{1:“字符串”,2:“整数”}), ConditionalField(FieldLenField(“len”,None,length of=“data”),lambda x:x.type==

我试图将一个字段添加到一个数据包中,该数据包的类型依赖于另一个字段值。 其中一个“类型”是一个var长度字符串,如果适用,还带有一个附加的“len”属性

考虑以下示例:

从scapy.all导入*
类测试包(数据包):
字段_desc=[
短字段(“索引”,0),
ByteEnumField(“类型”,0,{1:“字符串”,2:“整数”}),
ConditionalField(FieldLenField(“len”,None,length of=“data”),lambda x:x.type==1),
条件字段(StrLenField(“数据”,“长度”from=lambda pkt:pkt.len),lambda x:x.type==7或x.type==11),
条件字段(IntField(“数据”,1),lambda-pkt:pkt.type==2)]
p=TestPacket(index=12,type=1,data=“我的样本字符串”)
p、 show2()
p=TestPacket(索引=13,类型=2,数据=5)
p、 show2()
问题是“len”总是设置为4(IntField的长度,因为它是最后一个“data”条件字段)


实现此功能的最佳方式是什么?具有不同名称的条件字段?将原始字节存储为var长度字符串,无论类型如何?

您可以使用MultipleTypeField。看见

例如:

class DebugPacket(Packet):
    fields_desc = [
        ByteEnumField("atyp", 0x1, {0x1: "IPv4", 0x3: "DNS", 0x4: "IPv6"}),
        MultipleTypeField(
            [
                # IPv4
                (IPField("addr", "0.0.0.0"), lambda pkt: pkt.atyp == 0x1),
                # DNS
                (DNSStrField("addr", ""), lambda pkt: pkt.atyp == 0x3),
                # IPv6
                (IP6Field("addr", "::"), lambda pkt: pkt.atyp == 0x4),
            ],
            StrField("addr", "")  # By default
        ),
    ]
它允许您根据条件使用具有多种类型的同一字段