Python 反转字符串,但保持字符对在一起

Python 反转字符串,但保持字符对在一起,python,python-3.x,string,reverse,Python,Python 3.x,String,Reverse,我分析了PCAP文件的全局头,发现神奇的数字是:d4 c3 b2 a1 这意味着它使用了一个小的endian,它后面的所有字节都需要按相反的顺序处理。全局标题的其他部分如下所示: 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 然而,鉴于little

我分析了PCAP文件的全局头,发现神奇的数字是:d4 c3 b2 a1

这意味着它使用了一个小的endian,它后面的所有字节都需要按相反的顺序处理。全局标题的其他部分如下所示:

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
然而,鉴于little endian正在使用,它应该是:

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()))

我们的想法是首先将字符串切分为标记而不是字符,然后颠倒标记的顺序,然后将它们重新连接成一个长字符串。

您还需要执行以下步骤:

linktype = "00 00 00 01"
rev_linktype = " ".join(reversed(linktype.split()))
其思想是首先将字符串切分为标记而不是字符,然后颠倒标记的顺序,然后将它们重新合并为一个长字符串。

处理十六进制值而不是实际数据是不常见的。通常人们会处理存储在字节对象中的数据,如下所示:

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为您解决了问题,而且比您手工处理的速度更快。

处理十六进制值而不是实际数据是不寻常的。通常人们会处理存储在字节对象中的数据,如下所示:

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为您解决了问题,而且比您手工解决问题的速度更快。

请告诉我:如果您愿意,.joinlinktype.split[::-1]是相同的,但可以为您节省一些击键。请告诉我:如果您愿意,.joinlinktype.split[::-1]是相同的,但可以为您节省一些击键,您在问题的ASCII字符串中的意思是,还是PCAP二进制捕获中的实际字节?后者需要了解二进制格式中每个字节字段的宽度。为什么要先转换为十六进制?是指问题中的ASCII字符串,还是PCAP二进制捕获中的实际字节?后者需要了解二进制格式中每个字节字段的宽度。为什么要先转换为十六进制?