Python 设置FieldLenField的大小

Python 设置FieldLenField的大小,python,scapy,network-protocols,Python,Scapy,Network Protocols,我想要一个1字节的FieldLenField在相应的FieldListField中只允许256个项目,我该怎么做 from scapy import * class Foo(Packet): name = "Foo" fields_desc = [ ShortField("id", random.getrandbits(16)), FieldLenField("len", None, count_of="pld"), FieldL

我想要一个1字节的
FieldLenField
在相应的
FieldListField
中只允许256个项目,我该怎么做

from scapy import *

class Foo(Packet):
    name = "Foo"
    fields_desc = [
        ShortField("id", random.getrandbits(16)),
        FieldLenField("len", None, count_of="pld"),
        FieldListField("pld", None, IPField("", "0.0.0.0"), count_from=lambda pkt: pkt.len)
    ]
谢谢您的帮助。

将FieldLenField设置为1字节 您需要覆盖
FieldLenField
的默认长度,当前为
H
H
是Python结构库中的一个字符串,它是一个无符号的2字节(0-65535)。要强制一个字节无符号,请改用
B

从scapy导入*
Foo类(数据包):
name=“Foo”
字段描述=[
短字段(“id”,随机.getrandbits(16)),
FieldLenField(“len”,0,fmt=“B”,count\u of=“pld”),
FieldListField(“pld”,无,IPField(“,“0.0.0.0”),
count_from=lambda pkt:pkt.len)
]
pkt=Foo()
打印(字节(pkt))
运行此命令,我们将得到2个随机字节作为ID,1个字节作为len,如下所示:

b'\x21\xea\x00'

其中最后一个字节是我们设置的默认0

验证 相反,如果我们尝试将
len
的值设置为300,这超出了区间[0255],我们将得到一个错误:

pkt.len=300
字节(pkt)
...

错误:ubyte格式需要0为什么不在生成/读取此数据包时添加对>255项的检查?如果出现意外数量的项,则可以引发错误。请记住,Wireshark在意外位置看到字节(或将其标记为“格式错误的响应”)时也会抛出错误。@RossJacobs它有助于控制varfield
pld
的长度,但不会控制lenfield
len
的大小,因此它并不能真正解决我的问题。如果我最多有255个值,我不想要一个2字节的lenfield,因为只有1字节就足够了。谢谢。是否可以有任何所需的长度,或者只是逐字节的长度?fmt var必须是有效的结构格式字符如果不能回答您的注释问题,您可以将其作为一个问题提问,以便提供更多详细信息