¿Cómo trato un número entero como una matriz de bytes en Python?

StackOverflow https://stackoverflow.com/questions/10123

  •  08-06-2019
  •  | 
  •  

Pregunta

Estoy intentando decodificar el resultado de la función Python os.wait().Esto devuelve, según los documentos de Python:

una tupla que contiene su pid y su indicación de estado de salida:un número de 16 bits, cuyo byte bajo es el número de señal que finalizó el proceso y cuyo byte alto es el estado de salida (si el número de señal es cero);el bit alto del byte bajo se establece si se produjo un archivo principal.

¿Cómo decodifico la indicación del estado de salida (que es un número entero) para obtener el byte alto y bajo?Para ser específico, ¿cómo implemento la función de decodificación utilizada en el siguiente fragmento de código?

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
¿Fue útil?

Solución

Esto hará lo que quieras:

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

Otros consejos

Para responder a su pregunta general, puede utilizar manipulación de bits técnicas:

pid, status = os.wait()
exitstatus, signum = status & 0xFF, (status & 0xFF00) >> 8

Sin embargo, también hay funciones integradas para interpretar los valores del estado de salida:

pid, status = os.wait()
exitstatus, signum = os.WEXITSTATUS( status ), os.WTERMSIG( status )

Ver también:

  • sistema operativo.WCOREDUMP()
  • os.WIFCONTINUADO()
  • sistema operativo.WIFSTOPPED()
  • sistema operativo.WIFSIGNALED()
  • os.WIFEXITED()
  • sistema operativo.WSTOPSIG()

Puedes dividir tu int en una cadena de bytes sin firmar con el estructura módulo:

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)

Si combinas esto con el formación módulo puedes hacer esto más convenientemente:

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])
exitstatus, signum= divmod(status, 256)

Puede descomprimir el estado usando cambio de bits y enmascaramiento operadores.

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

No soy programador de Python, así que espero que la sintaxis sea correcta.

Las personas que me precedieron lo han logrado, pero si realmente lo quieres en una línea, puedes hacer esto:

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

EDITAR:Lo tenía al revés.

import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top