Как мне трактовать целое число как массив байтов в Python?

Я пытаюсь декодировать результат функции Python os.wait (). Это возвращает, согласно документации Python:

кортеж, содержащий его индикацию состояния pid и выхода: 16-битное число, младший байт которого является номером сигнала, который убил процесс, и старший байт которого является состоянием выхода (если номер сигнала равен нулю); старший бит младшего байта устанавливается, если был создан файл ядра.

Как мне декодировать индикацию состояния выхода (которая является целым числом) для получения старшего и младшего байта? Чтобы быть конкретным, как мне реализовать функцию декодирования, используемую в следующем фрагменте кода:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
13.08.2008 17:46:41
7 ОТВЕТОВ
РЕШЕНИЕ

Это будет делать то, что вы хотите:

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
12
13.08.2008 17:56:34
Хотя & 0xff00это избыточно, если на statusсамом деле только 16 бит.
Scott Griffiths 13.08.2009 15:57:12

Вы можете распаковать статус, используя операторы сдвига и маскирования .

low = status & 0x00FF
high = (status & 0xFF00) >> 8

Я не программист на Python, поэтому я надеюсь, что синтаксис правильный.

1
13.08.2008 17:58:27

Люди до меня это прибили, но если вы действительно хотите, чтобы это было в одной строке, вы можете сделать это:

(signum, exitstatus) = (status & 0xFF, (status >> 8) & 0xFF)

РЕДАКТИРОВАТЬ: было это задом наперед.

0
13.08.2008 18:26:37

Чтобы ответить на ваш общий вопрос, вы можете использовать методы манипуляции битами :

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 ()
12
7.01.2014 10:48:28

Вы можете разбить ваш 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])
2
26.03.2009 14:52:42
exitstatus, signum= divmod(status, 256)
2
26.03.2009 23:48:20
import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
0
28.04.2018 07:50:13
Это не намного полезнее, чем существующие ответы. Возможно, вы могли бы попытаться ответить на новые вопросы без ответов?
Ray 28.04.2018 08:09:48
Нет проблем. Ваше лучшее - это то, что будет иметь честь для этого сообщества :)
Ray 28.04.2018 09:21:06