Сведения о вопросе

Solllo

23:27, 7th August, 2020

Теги

python    

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

Просмотров: 376   Ответов: 7

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

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

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

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 



  Сведения об ответе

SKY

22:24, 26th August, 2020

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

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()


  Сведения об ответе

Chhiki

04:51, 18th August, 2020

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

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8


  Сведения об ответе

PROGA

16:43, 18th August, 2020

exitstatus, signum= divmod(status, 256)


  Сведения об ответе

PHPH

13:04, 22nd August, 2020

Вы можете разбить свой 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])


  Сведения об ответе

davran

21:59, 4th August, 2020

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

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

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


  Сведения об ответе

piter

16:35, 10th August, 2020

Те, кто был до меня, это уже сделали, но если вы действительно хотите, чтобы это было на одной линии, вы можете сделать это:

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

EDIT: было все наоборот.


  Сведения об ответе

SKY

21:06, 1st October, 2020

import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться