我正在尝试使用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元组和其余的有效负载,即空字符串. I.e.:\u0026gt;\u0026gt;\u0026gt; TypeError:只能将元组(不是“str”)连接到元组
有没有办法避免将位字段捆绑成完整的字节?
解决方法:
我猜数据包始终是字节对齐的,所以你可能不得不以某种方式使用某个字段,例如:
class StatusField(FlagsField):
name = '4 bit status'
def __init__(self, name):
FlagsField.__init__(self, name, 0, 4, ["a", "b", "c", "d"])
class TotalStatus(Packet):
name = "8 bit status"
fields_desc = [
StatusField("axis0"),
StatusField("axis1"),
]