разбить 32-битное число на отдельные поля - PullRequest
3 голосов
/ 26 января 2010

Есть ли в python быстрый способ быстрого разбиения 32-битной переменной, скажем, a1a2a3a4 на a1, a2, a3, a4? Я сделал это, изменив значение на гекс и затем разделив его, но это кажется пустой тратой времени на int -> string -> int.

Ответы [ 4 ]

13 голосов
/ 26 января 2010

Стандартный библиотечный модуль struct делает короткую работу:

>>> import struct
>>> x = 0xa1a2a3a4
>>> struct.unpack('4B', struct.pack('>I', x))
(161, 162, 163, 164)

"упаковка" с форматом '>I' превращает x в 4-байтовую строку в порядке с прямым порядком байтов, которая затем может быть немедленно "распакована" в четыре значения беззнакового размера в формате '4B'. Легкий горох.

6 голосов
/ 26 января 2010

В Python нет такой вещи, как 32-битная переменная. Это то, что вы имеете в виду?

x = 0xa1a2a3a4
a4 = int(x & 0xff)
a3 = int((x >> 8) & 0xff)
a2 = int((x >> 16) & 0xff)
a1 = int(x >> 24)

Как указывает SilentGhost, вам не нужно преобразование int, поэтому вы можете сделать это:

a4 = x & 0xff
a3 = (x >> 8) & 0xff
a2 = (x >> 16) & 0xff
a1 = x >> 24

Обратите внимание, что в более старых версиях Python вторая версия будет возвращать long, если значение x больше 0x7fffffff и вставляет в противном случае. Первая версия всегда возвращает int. В более новых версиях Python эти два типа унифицированы , поэтому вам не нужно беспокоиться об этой детали.

4 голосов
/ 26 января 2010

Использовать побитовые операции.

Например:

myvar = 0xcdf100cd
a0 = myvar & 0xff
a1 = (myvar >> 8) & 0xff
a2 = (myvar >> 16) & 0xff
a3 = (myvar >> 24) & 0xff

&0xff сохраняет младшие 8 битов значения и обнуляет остальные, а оператор сдвига битов (>>) используется для сдвига байта, который вы извлекаете, в эти младшие 8 битов.

0 голосов
/ 10 марта 2018

Слишком поздно, но я обычно делаю что-то вроде этого:

hexnum = 0xa1a2a3a4
bytes = []
while (hexnum > 0):
    bytes.insert(0, hexnum & 0xff)
    hexnum >>= 8

Не уверен, однако, если это более эффективно, чем распаковывать или нет (вероятно, не из-за использования list.insert ()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...