Wie behandle ich einen integer als Byte-array in Python?
-
08-06-2019 - |
Frage
Ich bin versucht zu decodieren, das Ergebnis des Python-os.wait () - Funktion.Das gibt, nach der Python-Dokumentation:
ein Tupel enthält die pid-und exit-status Anzeige:ein 16-bit-Zahl, deren low-byte ist das signal-Nummer, die getöteten, die den Prozess und deren high-byte der exit-status (wenn die Signalnummer null ist);das höchste bit des low-byte wird gesetzt, wenn eine core-Datei erzeugt wurde.
Wie kann ich entschlüsseln, den exit-status-Anzeige (eine Ganzzahl), um den high-und low-byte?Um genau zu sein, wie implementiere ich die decode-Funktion verwendet, die im folgenden code-snippet:
(pid,status) = os.wait()
(exitstatus, signum) = decode(status)
Lösung
Dies wird tun, was Sie wollen:
signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
Andere Tipps
Um die Antwort auf Ihre Allgemeine Frage, können Sie mit bit-manipulation Techniken:
pid, status = os.wait()
exitstatus, signum = status & 0xFF, (status & 0xFF00) >> 8
Es gibt jedoch auch gebaut-in Funktionen für die Interpretation der exit-status Werte:
pid, status = os.wait()
exitstatus, signum = os.WEXITSTATUS( status ), os.WTERMSIG( status )
Siehe auch:
- os.WCOREDUMP()
- os.WIFCONTINUED()
- os.WIFSTOPPED()
- os.WIFSIGNALED()
- os.WIFEXITED()
- os.WSTOPSIG()
Sie können erhalten Ihre Pause int in einen string unsigned bytes mit den 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)
Wenn Sie dieses paar mit der array Modul, Sie können dies tun, mehr bequem:
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)
Sie können entpacken Sie die status mit bit-Verschiebung und Maskierung Betreiber.
low = status & 0x00FF
high = (status & 0xFF00) >> 8
Ich bin kein Python-Programmierer, also ich hoffe ich habe die syntax korrekt ist.
Die Leute vor mir haben es genagelt, aber wenn Sie wirklich wollen, dass es auf einer Linie, können Sie dies tun:
(signum, exitstatus) = (status & 0xFF, (status >> 8) & 0xFF)
EDIT:Hatte Sie ihn nach hinten.
import amp as amp
import status
signum = status & 0xff
exitstatus = (status & 0xff00) >> 8