Come faccio a trattare un numero intero, come un array di byte in Python?

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

  •  08-06-2019
  •  | 
  •  

Domanda

Sto cercando di decodificare il risultato di Python os.funzione wait ().Questo torna, secondo il Python-docs:

una tupla contenente il suo pid e uscita indicazione di stato:16-numero di bit, di cui il byte basso è il numero di segnale che ha ucciso il processo, e di cui il byte alto è lo stato di uscita (se il numero del segnale è pari a zero);il bit del byte basso è impostato se un file core è stato prodotto.

Come faccio a decodificare l'uscita indicazione di stato (che è un numero intero) per ottenere l'alta e la bassa byte?Per essere specifici, come faccio a implementare la funzione decode utilizzato nel seguente frammento di codice:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
È stato utile?

Soluzione

Questo farà quello che vuole:

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

Altri suggerimenti

Per rispondere alla tua domanda di carattere generale, è possibile utilizzare la manipolazione dei bit tecniche:

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

Tuttavia, ci sono anche built-in funzioni di per interpretare lo stato di uscita valori:

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

Vedere anche:

  • os.WCOREDUMP()
  • os.WIFCONTINUED()
  • os.Wifstopped ha()
  • os.Wifsignaled ha()
  • os.WIFEXITED()
  • os.WSTOPSIG()

È possibile ottenere rompere il vostro int in una stringa di byte senza segno con la struct modulo:

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)

Se si coppia questo con il array modulo che si può fare questo più 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)

È possibile decomprimere lo stato utilizzando spostamento di bit e mascheratura operatori.

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

Io non sono un programmatore Python, quindi spero ottenuto la sintassi corretta.

La gente prima di me ho inchiodato, ma se si vuole veramente in una sola riga, si può fare questo:

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

EDIT:Aveva all'indietro.

import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top