4

scapy を使用して新しいプロトコルを追加しようとしていますが、長さが 1 バイト未満の他の 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()catpktタプルと残りのペイロード(空の文字列)で終わる長いトレースバックを提供します。すなわち:>>> TypeError: can only concatenate tuple (not "str") to tuple

ビットフィールドを完全なバイトに束ねないようにする方法はありますか?

4

1 に答える 1

4

Packet は常にバイト単位で整列されていると思いますので、何らかの方法でフィールドを使用する必要があるかもしれません。

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 に答える