Python에서 정수를 바이트 배열로 어떻게 처리합니까?

StackOverflow https://stackoverflow.com/questions/10123

  •  08-06-2019
  •  | 
  •  

문제

Python os.wait() 함수의 결과를 디코딩하려고 합니다.Python 문서에 따르면 이는 다음을 반환합니다.

pid와 종료 상태 표시를 포함하는 튜플:16비트 숫자, 낮은 바이트는 프로세스를 종료한 신호 번호이고 높은 바이트는 종료 상태(신호 번호가 0인 경우)입니다.코어 파일이 생성된 경우 낮은 바이트의 높은 비트가 설정됩니다.

상위 및 하위 바이트를 얻기 위해 종료 상태 표시(정수)를 어떻게 디코딩합니까?구체적으로 말하면 다음 코드 조각에 사용되는 디코드 기능을 어떻게 구현합니까?

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
도움이 되었습니까?

해결책

이것은 당신이 원하는 것을 할 것입니다 :

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8

다른 팁

일반적인 질문에 답하려면 다음을 사용하세요. 비트 조작 기법:

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

그러나 또한 내장 기능 종료 상태 값을 해석하려면 다음을 수행하세요.

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

또한보십시오:

  • os.WCOREDUMP()
  • os.WIF계속()
  • os.WIF중지됨()
  • os.WIFSIGNALED()
  • os.WIFEXITED()
  • os.WSTOPSIG()

다음을 사용하여 int를 부호 없는 바이트 문자열로 나눌 수 있습니다. 구조체 기준 치수:

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)

이것을 와 결합하면 정렬 모듈을 사용하면 이 작업을 더 편리하게 수행할 수 있습니다.

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)

다음을 사용하여 상태의 압축을 풀 수 있습니다. 비트 이동 그리고 마스킹 연산자.

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

저는 Python 프로그래머가 아니므로 구문이 정확하길 바랍니다.

나보다 앞선 사람들이 성공했지만, 정말로 한 줄로 작성하고 싶다면 다음과 같이 할 수 있습니다.

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

편집하다:거꾸로 했어요.

import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top