我已经分析了PCAP文件的全局标题,发现幻数是:d4 c3 b2 a1
这意味着它使用一个小端和所有需要以相反顺序处理后的字节。全局标题的其他部分如下:
major version = 02 00
minor version = 04 00
time zone = 00 00 00 00
timestamp = 00 00 00 00
snaplen = ff ff 00 00
linktype = 01 00 00 00
但是,鉴于使用小端,它应该是:
major version = 00 02
minor version = 00 04
time zone = 00 00 00 00
timestamp = 00 00 00 00
snaplen = 00 00 ff ff
linktype = 00 00 00 01
所以我需要一种方法来反转字符串,但仍然保持由空格以相同顺序分隔的字符对。
因此代码[:: - 1]将无法工作,因为它将02 00转换为00 20,而它需要为00 02
我该怎么做呢?
您还需要执行以下步骤:
linktype = "00 00 00 01"
rev_linktype = " ".join(reversed(linktype.split()))
我们的想法是首先将字符串切换为标记而不是字符,然后反转标记的顺序,然后将它们连接回一个长字符串。
处理十六进制值而不是实际数据是不常见的。通常人们会处理存储在bytes
对象中的数据,如下所示:
major_version = b"\x02\x00"
minor_version = b"\x04\x00"
time_zone = b"\x00\x00\x00\x00"
timestamp = b"\x00\x00\x00\x00"
snaplen = b"\xff\xff\x00\x00"
linktype = b"\x01\x00\x00\x00"
我建议将你的常量存储为数字:
major_version = 0x02_00
minor_version = 0x04_00
time_zone = 0x00_00_00_00
timestamp = 0x00_00_00_00
snaplen = 0xff_ff_00_00
linktype = 0x01_00_00_00
因为那时你可以这样做:
if magic_bytes == b"\xd4\xc3\xb2\xa1":
endianness = "little"
else:
endianness = "big"
# a little while later, when we need to use the major version number:
major_version.to_bytes(2, endianness) # major version takes up 2 bytes
如果你想知道的话,还有一个int.from_bytes
! Python为您解决了问题,并且比您手动完成的速度更快。