Как в Python трактовать целое число как массив байтов?
Я пытаюсь декодировать результат функции Python os.wait (). Это возвращается, согласно документам Python:
кортеж, содержащий его pid и индикацию статуса выхода: 16-битное число, младший байт которого является номером сигнала, завершившего процесс, а старший байт - статусом выхода (если номер сигнала равен нулю); старший бит младшего байта устанавливается, если был создан файл ядра.
Как мне декодировать индикацию статуса выхода (которая является целым числом), чтобы получить старший и младший байт? Чтобы быть конкретным, как мне реализовать функцию декодирования, используемую в следующем фрагменте кода:
(pid,status) = os.wait()
(exitstatus, signum) = decode(status)
Ответов (7)7
Вы можете распаковать статус с помощью операторов битового сдвига и маскирования .
low = status & 0x00FF
high = (status & 0xFF00) >> 8
Я не программист на Python, поэтому надеюсь, что синтаксис правильный.
Чтобы ответить на ваш общий вопрос, вы можете использовать битовые манипуляции
pid, status = os.wait()
exitstatus, signum = status & 0xFF, (status & 0xFF00) >> 8
Однако есть также встроенные функции для интерпретации значений статуса выхода:
pid, status = os.wait()
exitstatus, signum = os.WEXITSTATUS( status ), os.WTERMSIG( status )
Смотрите также:
- os.WCOREDUMP ()
- os.WIFCONTINUED ()
- os.WIFSTOPPED ()
- os.WIFSIGNALED ()
- os.WIFEXITED ()
- os.WSTOPSIG ()
Вы можете разбить свой int на строку беззнаковых байтов с помощью модуля struct :
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])