Этот ответ относится к Scapy 2.2.0.
LenField
с, как правило, работают в парах, как показано ниже:
FieldLenField("len", None, length_of="data")
StrLenField("data", "", length_from=lambda pkt:pkt.len)
Обратите внимание, как length_of
и length_from
связать два поля вместе.Значение length_of
указывает Scapy, как вычислять поле "len"
при отправке пакета (обратите внимание, что по умолчанию установлено значение None
, чтобы указать, что оно должно рассчитываться автоматически).Значение length_from
сообщает Scapy, сколько байтов нужно ввести в поле "data"
, когда оно рассекает пакет.
Существует специальное поле, называемое LenField
, которое можно использоватьсамо собой.Еще раз обратите внимание, что значением по умолчанию является None
, означающее, что оно должно рассчитываться автоматически.Когда отправка Scapy будет просто вычислять "len"
как число байтов, следующих за текущим слоем.
LenField("len", None)
Теперь, когда введены поля длины, вы можете использовать Python для кодирования выводаStrLenField
в гекс.
# In layer definition
BitFieldLenField("lenfield", None, 8, length_of="varfield")
StrLenField("varfield", "", length_from=lambda pkt:pkt.lenfield)
# In main script
print(pck[mylayer].varfield.encode("hex")) # Replace "mylayer" with the name of your new layer