2016-04-20 4 views
0

Dies ist die seltsame comportement:Hinzufügen von neuem Paket scapy: seltsame Fehler mit zufälliger Position Felder

ReturnCodeEnum = { 
    0x1: "vardiag", 
    0x2: "gambit" 
} 

TransportSizeEnum = { 
    0x10: "No error", 
    0x11: "Error: ressource not find", 
    0x21: "Error: busy" 
} 


class UNSPECIFIED(Packet): 
    name = "UNSPECIFIED" 
    fields_desc = { 
     ByteEnumField("returncode", 0x00, ReturnCodeEnum), 
     ByteEnumField("transportsize", 0x0, TransportSizeEnum), 
     FieldLenField("len", None, length_of="datapart"), 
     StrLenField("datapart", "", length_from=lambda pkt: pkt.len) 
    } 


In [21]: a = UNSPECIFIED() 

In [24]: a.show() 
###[ UNSPECIFIED ]### 
    len  = None 
    returncode= 0 
    datapart = '' 
    transportsize= 0 

In [25]: # Reloading the file 
In [26]: a = UNSPECIFIED() 

In [27]: a.show() 
###[ UNSPECIFIED ]### 
    datapart = '' 
    transportsize= 0 
    len  = None 
    returncode= 0 

In [28]: a.show2() 
###[ UNSPECIFIED ]### 
    datapart = '\x00\x00\x00\x00' 
    transportsize= 0 
    len  = 0 
    returncode= 0 

In [29]: 
In [30]: a = UNSPECIFIED() 

In [33]: a.show() 
###[ UNSPECIFIED ]### 
    len  = None 
    returncode= 0 
    datapart = '' 
    transportsize= 0 

In [34]: a.show2() 
###[ UNSPECIFIED ]### 
    len  = 0 
    returncode= 0 
    datapart = '' 
    transportsize= 0 

Paketfelder Position nicht eingehalten werden. Jedes Mal, wenn ich diese Quelle neu lade, ändern sich die Positionen des Feldes. Ich baue eine Menge scapy packet, aber es ist das erste Mal, dass dieser Bug mir passiert. Vielleicht verwende ich nicht korrekt die Verbindung FieldLenField/StrLenField?

Antwort

0

ich falsch sein könnte „Jedes Mal, wenn ich diese Quelle neu zu laden, ändern Positionen Feld“ aber solange Ihr Schlüssel/Wert-Paare gleich bleiben, ich denke, was Sie sehen, ist das Ergebnis von Wörterbüchern, die von Natur aus ungeordnet sind. Von the docs:

ist es am besten von einem Wörterbuch zu denken, als eine ungeordnete Menge von Schlüsseln: Wert Paare, mit der Forderung, dass die Schlüssel eindeutig sind (innerhalb eines Wörterbuch)

Ein einfachen Test:

dict_order_test.py

my_dict = {"a":1, "b":2, "c":3} 
print (my_dict) 

Terminal-Ausgang:

$ python3 dict_order_test.py 
{'b': 2, 'c': 3, 'a': 1} 
$ python3 dict_order_test.py 
{'b': 2, 'a': 1, 'c': 3} 
$ python3 dict_order_test.py 
{'c': 3, 'a': 1, 'b': 2} 
$ python3 dict_order_test.py 
{'c': 3, 'a': 1, 'b': 2} 

zu ändern, was ich oben etwas schrieb, Wörterbücher wird haben eine Art von Ordnung, aber Sie können auf es einfach nicht zählen und es ändert sich oft jedes Mal, wenn Sie ein Skript ausführen. Wenn ich mich richtig erinnere, wird die Reihenfolge davon bestimmt, welche Arten von Daten sie enthalten und wie sie intern von Python gehasht werden. Manchmal ändert sich die Reihenfolge nicht, manchmal tut es das; Wie auch immer, es ist unzuverlässig, also verwenden Sie eine list oder eine , wenn es darauf ankommt.

+0

Oh ja, du hast Recht. Ich muss eine Liste anstelle eines Diktats verwenden. Danke für dein kleines Mooc. –