Я пытаюсь добавить новый протокол с помощью scapy и сталкиваюсь с трудностями при создании пакетов, в которых хранятся другие «пакеты» BitEnumField, длина которых не превышает один байт.Мне было интересно, если есть обходной путь, чтобы заставить его работать (без упаковки пакетов в полные байтовые поля).Вот пример:
from scapy.packet import Packet
from scapy.fields import *
class Status(Packet):
name = '4 bit status'
fields_desc = [
BitEnumField('a', 0, 1, {0:'Disabled', 1:'Enabled'}),
BitEnumField('b', 0, 1, {0:'Disabled', 1:'Active'}),
BitEnumField('c', 0, 1, {0:'Disabled', 1:'Active'}),
BitEnumField('d', 0, 1, {0:'Disabled', 1:'Active'}),
]
#this is added for debug purposes only
def post_build(self, pkt,pay):
print "pkt:", pkt, "type:", type(pkt)
return pkt+pay
Теперь я могу понять, почему Status().show2()
дает сбой, когда pkt
имеет длину всего 4 бита.но этот тоже умирает (я полагаю, потому что каждый пакет формируется независимо):
class TotalStatus(Packet):
name = "8 bit status"
fields_desc = [
PacketField('axis0', Status(), Status),
PacketField('axis1', Status(), Status),
]
TotalStatus().show2()
дает вам длительную обратную трассировку, которая заканчивается self.post_build()
неспособностью cat pkt
кортежем и остальной полезной нагрузкой, которая является пустой строкой.Т.е.: >>> TypeError: can only concatenate tuple (not "str") to tuple
Есть ли способ избежать объединения битовых полей в полные байты?