Обратная строка, но держите пары символов вместе - PullRequest
1 голос
/ 19 марта 2019

Я проанализировал глобальный заголовок файла 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

Однако, учитывая, что используется 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

Как бы я поступил так?

Ответы [ 2 ]

6 голосов
/ 19 марта 2019

Для этого нужно сделать еще несколько шагов:

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

Идея состоит в том, чтобы сначала нарезать строку на токены вместо символов, затем изменить порядок следования токенов, а затем соединить их обратно водна длинная строка.

2 голосов
/ 19 марта 2019

Необычно обрабатывать шестнадцатеричные значения вместо фактических данных. Обычно люди обрабатывают данные, хранящиеся в 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 решает вашу проблему для вас и быстрее, чем вы можете сделать это вручную.

...