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
ビットフィールドを完全なバイトに束ねないようにする方法はありますか?