2011-10-26 33 views
4

我試圖用scapy添加一個新的協議,並且遇到了構建存儲其他BitEnumField「數據包」的數據包時出現困難的問題,該數據包位於一個字節的長度下。我想知道是否有一個解決方法,使其工作(沒有捆綁到全字節字段的數據包)。這裏是例子:使用短於8位的PacketField構建scapy數據包

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()無法貓pkt元組和有效載荷的其餘部分,裏面是空的字符串結束。 I.e .: >>> TypeError: can only concatenate tuple (not "str") to tuple

有沒有辦法避免將位字段綁定到完整字節?

+0

是你的目標,不發送沿着這些線路全部字節或東西嗎? – synthesizerpatel

+0

不,目標始終是發送完整字節,類似於具有比字節更短的複雜字段的「TotalStatus」類型的數據包。 – Oleksiy

回答

4

我想這一個數據包是按字節對齊,所以你可能必須以某種方式使用領域,e.g:

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"), 
    ]