Como trato um número inteiro como uma matriz de bytes em Python?
-
08-06-2019 - |
Pergunta
Estou tentando decodificar o resultado da função Python os.wait().Isso retorna, de acordo com a documentação do Python:
uma tupla contendo seu pid e indicação de status de saída:um número de 16 bits, cujo byte inferior é o número do sinal que encerrou o processo e cujo byte superior é o status de saída (se o número do sinal for zero);o bit alto do byte baixo é definido se um arquivo principal foi produzido.
Como decodifico a indicação do status de saída (que é um número inteiro) para obter o byte alto e baixo?Para ser mais específico, como implemento a função de decodificação usada no seguinte trecho de código:
(pid,status) = os.wait()
(exitstatus, signum) = decode(status)
Solução
Isso fará o que você deseja:
signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
Outras dicas
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 integradas para interpretar valores de status de saída:
pid, status = os.wait()
exitstatus, signum = os.WEXITSTATUS( status ), os.WTERMSIG( status )
Veja também:
- os.WCOREDUMP()
- os.WIFCONTINUADO()
- os.WIFSTOPPED()
- os.WIFSIGNALED()
- os.WIFEXITED()
- os.WSTOPSIG()
Você pode quebrar seu int em uma sequência de bytes não assinados com o estrutura 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ê juntar isso com o variedade módulo 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])
exitstatus, signum= divmod(status, 256)
Você pode descompactar o status usando mudança de bits e mascarar operadores.
low = status & 0x00FF
high = (status & 0xFF00) >> 8
Não sou um programador Python, então espero que a sintaxe esteja correta.
O pessoal antes de mim acertou em cheio, mas se você realmente quiser em uma linha, pode fazer o seguinte:
(signum, exitstatus) = (status & 0xFF, (status >> 8) & 0xFF)
EDITAR:Estava ao contrário.
import amp as amp
import status
signum = status & 0xff
exitstatus = (status & 0xff00) >> 8