Como faço para tratar um inteiro como uma matriz de bytes em Python?

votos
10

Eu estou tentando decodificar o resultado da função Python os.wait (). Isso retorna, de acordo com os docs Python:

um tuplo contendo o seu PID e indicação de estado de saída: um número de 16 bits, cujas byte baixo é o número de sinais que matou o processo, e cuja byte é o estado de saída (se o número de sinal é zero); o bit do byte baixo é definida, se um arquivo de núcleo foi produzido.

Como descodificar a indicação do estado de saída (que é um número inteiro) para se obter o byte alto e baixo? Para ser mais específico, como faço para implementar a função de decodificação usado no seguinte trecho de código:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
Publicado 13/08/2008 em 18:46
fonte usuário
Em outras línguas...                            


7 respostas

votos
11

Para responder à sua pergunta geral, você pode usar manipulação de bits técnicas:

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

No entanto, também existem funções internas para interpretar os valores de estado de saída:

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

Veja também:

  • os.WCOREDUMP ()
  • os.WIFCONTINUED ()
  • os.WIFSTOPPED ()
  • os.WIFSIGNALED ()
  • os.WIFEXITED ()
  • os.WSTOPSIG ()
Respondeu 13/08/2008 em 19:52
fonte usuário

votos
11

Isto irá fazer o que quiser:

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
Respondeu 13/08/2008 em 18:56
fonte usuário

votos
2
exitstatus, signum= divmod(status, 256)
Respondeu 27/03/2009 em 00:48
fonte usuário

votos
2

Você pode obter quebrar seu int em uma string de sem assinatura bytes com a struct módulo:

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 você par isso com a variedade módulo que você pode fazer isso de forma mais 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])
Respondeu 26/03/2009 em 15:52
fonte usuário

votos
1

Você pode descompactar o status usando bit-shifting e mascaramento operadores.

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

Eu não sou um programador de Python, então eu espero que tem a sintaxe correta.

Respondeu 13/08/2008 em 18:58
fonte usuário

votos
0
import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
Respondeu 28/04/2018 em 07:50
fonte usuário

votos
0

O pessoal antes me've acertou em cheio, mas se você realmente quer em uma linha, você pode fazer isso:

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

EDIT: Tinha-o para trás.

Respondeu 13/08/2008 em 19:14
fonte usuário

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