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

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

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

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

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

7 ответов

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

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

    EDIT: had it backward.

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

    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()
    • ОС.WIFSTOPPED()
    • ОС.WIFSIGNALED()
    • ОС.WIFEXITED()
    • ОС.WSTOPSIG()
  3. С помощью модуля struct можно разбить 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)
    

    Если вы связываете это с модулем array, вы можете сделать это более удобно:

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