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

голоса
10

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

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

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

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
Задан 13/08/2008 в 16:46
источник пользователем
На других языках...                            


7 ответов

голоса
11

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

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
Ответил 13/08/2008 в 16:56
источник пользователем

голоса
1

Вы можете распаковать статус с помощью бит сдвига и маскирования операторов.

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

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

Ответил 13/08/2008 в 16:58
источник пользователем

голоса
0

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

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

EDIT: Если бы его назад.

Ответил 13/08/2008 в 17:14
источник пользователем

голоса
11

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

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 ()
Ответил 13/08/2008 в 17:52
источник пользователем

голоса
2

Вы можете получить разбить 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])
Ответил 26/03/2009 в 13:52
источник пользователем

голоса
2
exitstatus, signum= divmod(status, 256)
Ответил 26/03/2009 в 22:48
источник пользователем

голоса
0
import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
Ответил 28/04/2018 в 06:50
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more