type - ¿Cómo trato un entero como una matriz de bytes en Python?
string methods python 3 (6)
Esto hará lo que quieras:
signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
Estoy intentando decodificar el resultado de la función Python os.wait (). Esto regresa, de acuerdo con los documentos de Python:
una tupla que contiene su indicación de estado de salida y pid: un número de 16 bits, cuyo byte bajo es el número de señal que mató 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 core.
¿Cómo decodifico la indicación de 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)
La gente antes que yo lo he clavado, pero si realmente lo quieres en una línea, puedes hacer esto:
(signum, exitstatus) = (status & 0xFF, (status >> 8) & 0xFF)
EDITAR: Lo tuve al revés.
Puede descomprimir el estado usando operadores de cambio de bits y enmascaramiento .
low = status & 0x00FF
high = (status & 0xFF00) >> 8
No soy un programador de Python, así que espero que la sintaxis sea correcta.
Puede obtener romper su int en una cadena de bytes sin firmar con el módulo 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)
Si combina esto con el módulo de matriz , puede hacerlo de manera más conveniente:
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)
Para responder a su pregunta general, puede usar técnicas de manipulación de bits :
pid, status = os.wait()
exitstatus, signum = status & 0xFF, (status & 0xFF00) >> 8
Sin embargo, también hay funciones incorporadas para interpretar los valores de estado de salida:
pid, status = os.wait()
exitstatus, signum = os.WEXITSTATUS( status ), os.WTERMSIG( status )
Ver también:
- os.WCOREDUMP ()
- os.WIFCONTINUED ()
- os.WIFSTOPPED ()
- os.WIFSIGNALED ()
- os.WIFEXITED ()
- os.WSTOPSIG ()