Cum tratez un întreg ca o serie de octeți în Python?

Încerc să decodez rezultatul funcției Python os.wait (). Acest lucru revine, conform documentelor Python:

un tuplu care conține indicația de stare a lui pid și ieșire: un număr pe 16 biți, al cărui byte scăzut este numărul de semnal care a ucis procesul și al cărui octet mare este starea de ieșire (dacă numărul semnalului este zero); bitul mare al byte-ului scăzut este setat dacă a fost produs un fișier de bază.

Cum decodez indicația de stare de ieșire (care este un număr întreg) pentru a obține octetul înalt și scăzut? Pentru a fi specific, cum pot implementa funcția de decodare utilizată în următorul fragment de cod:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
0
fr hi bn

7 răspunsuri

Acest lucru va face ceea ce doriți:

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
0
adăugat
redundant, dar am crezut că a fost puțin mai clar.
adăugat autor Mark Harrison, sursa
Cu toate că & 0xff00 este redundant dacă status este într-adevăr doar 16 biți.
adăugat autor Scott Griffiths, sursa

Oamenii de dinaintea mea m-au uitat, dar daca vrei cu adevarat pe o singura linie, poti face asta:

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

EDIT: A fost înapoi.

0
adăugat

Puteți obține o pauză a int într-un șir de octeți nesemnate cu modulul 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)

Dacă cuplați acest lucru cu modulul array , puteți face acest lucru mai convenabil:

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])
0
adăugat
exitstatus, signum= divmod(status, 256)
0
adăugat

Pentru a răspunde la întrebarea dvs. generală, puteți folosi tehnicile manipulare bit :

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

Cu toate acestea, există și funcții încorporate pentru interpretarea ieșirii valorile de stare:

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

Vezi si:

  • os.WCOREDUMP()
  • os.WIFCONTINUED()
  • os.WIFSTOPPED()
  • os.WIFSIGNALED()
  • os.WIFEXITED()
  • os.WSTOPSIG()
0
adăugat
import amp as amp
import status
signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
0
adăugat
Mulțumesc, vă rugăm să nu dați minus. Sunt newbie și încerc să fac tot ce pot.
adăugat autor Barish Ahsen, sursa
Acest lucru nu este mult mai util decât răspunsurile existente. Poate că ați putea încerca să răspundeți la întrebările noi fără răspuns?
adăugat autor Ray, sursa
Nici o problema. Cel mai bun lucru este ceea ce această comunitate ar fi onorată să aibă :)
adăugat autor Ray, sursa
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.