这是一个奇怪的竞争对手:
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
不尊重数据包字段位置。每次重新加载此源时,字段的位置都在变化。我构建了很多scapy数据包,但这是我第一次遇到这个bug。也许我没有正确使用关联FieldLenField / StrLenField?
答案 0 :(得分:0)
“每次重新加载此来源时,字段的位置都会发生变化”
我可能错了,但只要您的键/值对保持不变,我认为您所看到的是字典本身无序的结果。来自the docs:
最好将字典视为一组无序的键:值 对,要求密钥是唯一的(在一个内 字典)
一个简单的测试:
dict_order_test.py
my_dict = {"a":1, "b":2, "c":3}
print (my_dict)
终端输出:
$ 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}
要稍微修改我上面写的内容,词典将有某种顺序,但你不能指望它,而且每次运行脚本时它经常会改变。如果我没记错的话,顺序取决于它们包含哪些类型的数据以及Python如何在内部进行哈希处理。有时订单不会改变,有时它会改变;无论哪种方式,它都是不可靠的,所以如果重要的话,请使用list
或OrderedDict
。