2008-08-13 8 views
10

Estoy intentando decodificar el resultado de la función os.wait() de Python. Esto devuelve, de acuerdo con los documentos de Python:¿Cómo trato un entero como una matriz de bytes en Python?

una tupla que contiene su indicación pid y estado de salida: un número de 16 bits, cuyo byte bajo es el número de la señal que mató el proceso, y cuyo byte alta es la salida estado (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 decodizo la indicación de estado de salida (que es un número entero) para obtener el byte alto y bajo? Para ser más específicos, ¿Cómo se implementa la función de decodificación utilizado en el siguiente fragmento de código:

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

Respuesta

11

Esto va a hacer lo que quiere:

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

Aunque el '& 0xff00' es redundante si'Estado' es realmente sólo de 16 bits. –

+1

redundante, pero pensé que era un poco más claro. –

1

Usted puede desempaquetar el estado utilizando bit-shifting y masking operadores.

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

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

0

La gente antes me've clavado, pero si realmente lo desea en una línea, usted puede hacer esto:

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

EDIT: Lo tenía al revés.

11

Para responder a su pregunta general, puede utilizar bit manipulation técnicas:

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

Sin embargo, también built-in functions son para la interpretación de 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()
2

Usted puede conseguir romper su int en una cadena de bytes sin signo 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 se combina esto con la array módulo Se puede hacer esto con mayor comodidad:

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