Hvordan behandler jeg et tall som en matrise av byte i Python du?

stemmer
10

Jeg prøver å dekode resultatet av Python os.wait () -funksjonen. Dette returnerer, i henhold til Python docs:

en tuppel som inneholder dens PID og utgang statusindikasjon: et 16-bits tall, som har lav byte er signalet tall som drepte prosessen, og som har høy byte er utgangsstatus (hvis signalnummeret er null); den høye bit av den lave byte blir satt hvis en kjerne fil ble produsert.

Hvordan dekode utgangsstatusindikasjon (som er et helt tall) for å oppnå den høye og lave byte do? For å være konkret, hvordan kan jeg implementere dekode funksjon som brukes i følgende kodebit:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
Publisert på 13/08/2008 klokken 17:46
kilden bruker
På andre språk...                            


7 svar

stemmer
12

For å svare på generelle spørsmål, kan du bruke litt manipulasjon teknikker:

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

Men det er også innebygde funksjoner for å tolke exit statusverdier:

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

Se også:

  • os.WCOREDUMP ()
  • os.WIFCONTINUED ()
  • os.WIFSTOPPED ()
  • os.WIFSIGNALED ()
  • os.WIFEXITED ()
  • os.WSTOPSIG ()
Svarte 13/08/2008 kl. 18:52
kilden bruker

stemmer
11

Dette vil gjøre hva du vil:

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
Svarte 13/08/2008 kl. 17:56
kilden bruker

stemmer
2
exitstatus, signum= divmod(status, 256)
Svarte 26/03/2009 kl. 23:48
kilden bruker

stemmer
2

Du kan få bryte int i en rekke usignerte byte med struct modul:

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)

Hvis du par dette med matrisen modulen kan du gjøre dette mer praktisk:

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])
Svarte 26/03/2009 kl. 14:52
kilden bruker

stemmer
1

Du kan pakke status ved hjelp av bit-skiftende og maskerings operatører.

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

Jeg er ikke en Python programmerer, så jeg håper fikk syntaksen riktig.

Svarte 13/08/2008 kl. 17:58
kilden bruker

stemmer
0
import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
Svarte 28/04/2018 kl. 07:50
kilden bruker

stemmer
0

Folk før me've spikret det, men hvis du virkelig vil ha det på en linje, kan du gjøre dette:

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

EDIT: Hadde det bakover.

Svarte 13/08/2008 kl. 18:14
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more