4

我正在尝试使用 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

有什么方法可以避免将位字段捆绑成完整字节?

4

1 回答 1

4

我猜一个数据包总是字节对齐的,所以你可能不得不以某种方式使用一个字段,例如:

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"),
  ] 
于 2011-10-26T20:46:10.343 回答