我正在尝试使用 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
现在我可以理解为什么只有 4 位长会Status().show2()
失败。pkt
但是这个也死了(我猜是因为每个数据包都是独立形成的):
class TotalStatus(Packet):
name = "8 bit status"
fields_desc = [
PacketField('axis0', Status(), Status),
PacketField('axis1', Status(), Status),
]
TotalStatus().show2()
为您提供冗长的回溯,最终self.post_build()
无法对pkt
元组和有效负载的其余部分进行分类,这是空字符串。IE:>>> TypeError: can only concatenate tuple (not "str") to tuple
有什么方法可以避免将位字段捆绑成完整字节?