反向字符串,但将字符对保持在一起

时间:2019-03-19 17:28:38

标签: python python-3.x string reverse

我分析了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

我该怎么做?

2 个答案:

答案 0 :(得分:6)

您还需要执行一些步骤:

linktype = "00 00 00 01"
rev_linktype = " ".join(reversed(linktype.split()))

这个想法是先将字符串切成令牌,而不是字符,然后反转令牌的顺序,然后将它们重新连接成一个长字符串。

答案 1 :(得分:2)

处理十六进制值而不是实际数据是不寻常的。通常, 人们将处理存储在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为您解决了您的问题,并且比您手动完成要快。