Как мне рассматривать целое число как массив байтов в Python?
-
08-06-2019 - |
Вопрос
Я пытаюсь декодировать результат функции Python os.wait().Согласно документации Python, это возвращает:
кортеж, содержащий его pid и указание статуса выхода:16-битное число, младший байт которого — это номер сигнала, который остановил процесс, а старший байт — статус выхода (если номер сигнала равен нулю);старший бит младшего байта устанавливается, если был создан основной файл.
Как декодировать индикатор состояния выхода (который является целым числом), чтобы получить старший и младший байт?Точнее, как реализовать функцию декодирования, используемую в следующем фрагменте кода:
(pid,status) = os.wait()
(exitstatus, signum) = decode(status)
Решение
Это сделает то, что вы хотите:
signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
Другие советы
Чтобы ответить на ваш общий вопрос, вы можете использовать манипуляция битами методы:
pid, status = os.wait()
exitstatus, signum = status & 0xFF, (status & 0xFF00) >> 8
Однако существуют также встроенные функции для интерпретации значений статуса выхода:
pid, status = os.wait()
exitstatus, signum = os.WEXITSTATUS( status ), os.WTERMSIG( status )
Смотрите также:
- ОС.WCOREDUMP()
- ОС.WIFCONTINUED()
- ОС.ВИФСТОППЕД()
- ОС.WIFSIGNALED()
- ОС.WIFEXITED()
- ОС.WSTOPSIG()
Вы можете разбить свой int на строку беззнаковых байтов с помощью структура модуль:
import struct
i = 3235830701 # 0xC0DEDBAD
s = struct.pack(">L", i) # ">" = Big-endian, "<" = Little-endian
print s # '\xc0\xde\xdb\xad'
print s[0] # '\xc0'
print ord(s[0]) # 192 (which is 0xC0)
Если вы соедините это с множество модуль, вы можете сделать это более удобно:
import struct
i = 3235830701 # 0xC0DEDBAD
s = struct.pack(">L", i) # ">" = Big-endian, "<" = Little-endian
import array
a = array.array("B") # B: Unsigned bytes
a.fromstring(s)
print a # array('B', [192, 222, 219, 173])
exitstatus, signum= divmod(status, 256)
Распаковать статус можно с помощью сдвиг битов и маскировка операторы.
low = status & 0x00FF
high = (status & 0xFF00) >> 8
Я не программист на Python, поэтому надеюсь, что синтаксис у меня правильный.
Люди до меня это поняли, но если вы действительно хотите, чтобы это было в одной строке, вы можете сделать это:
(signum, exitstatus) = (status & 0xFF, (status >> 8) & 0xFF)
РЕДАКТИРОВАТЬ:Если бы это было наоборот.
import amp as amp
import status
signum = status & 0xff
exitstatus = (status & 0xff00) >> 8