Установка FieldLenField на 1 байт
Вам необходимо переопределить длину по умолчанию для FieldLenField
, которая в настоящее время H
. H
- это символ формата из структуры библиотеки Python, представляющий собой 2 байта без знака (0-65535). Чтобы форсировать однобайтовое беззнаковое, вместо этого используйте B
:
from scapy import *
class Foo(Packet):
name = "Foo"
fields_desc = [
ShortField("id", random.getrandbits(16)),
FieldLenField("len", 0, fmt="B", count_of="pld"),
FieldListField("pld", None, IPField("", "0.0.0.0"),
count_from=lambda pkt: pkt.len)
]
pkt = Foo()
print(bytes(pkt))
Запустив это, мы получим 2 случайных байта для идентификатора и 1 байт для len, который выглядит следующим образом:
b'\x21\xea\x00'
где последний байт является значением по умолчанию 0, которое мы установили.
Проверка
Если вместо этого мы попытаемся установить значение len
равным 300, который находится вне интервала [0, 255], мы получим ошибку:
pkt.len = 300
bytes(pkt)
...<traceback>
error: ubyte format requires 0 <= number <= 255