如何在Python中将整数视为字节数组?

15
我想解码Python os.wait()函数的结果。根据Python文档,它返回一个元组,其中包含其pid和退出状态指示:一个16位数字,其低字节是杀死该进程的信号编号,高字节是退出状态(如果信号编号为零);如果生成了核心文件,则将低字节的最高位设置为1。
如何解码退出状态指示(它是一个整数),以获取高字节和低字节?具体而言,在以下代码片段中使用的解码函数如何实现?
(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
7个回答

14

这会实现你想要的功能:

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

如果status确实只有16位,那么& 0xff00是多余的。 - Scott Griffiths

13

回答您的一般问题,您可以使用位运算

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.WIFCONTINUED()
  • os.WIFSTOPPED()
  • os.WIFSIGNALED()
  • os.WIFEXITED()
  • os.WSTOPSIG()

2
你可以使用 struct 模块将你的 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)

如果你将这个与 array 模块耦合在一起,你就可以更方便地完成这个操作:
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])

2
exitstatus, signum= divmod(status, 256)

1
你可以使用位移掩码运算符来解包状态。
low = status & 0x00FF
high = (status & 0xFF00) >> 8

我不是Python程序员,所以希望语法是正确的。


0
import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8

这并没有比现有的答案更有用。也许你可以尝试回答那些没有答案的新问题? - Ray
没问题。你的最好表现将会是这个社区荣幸拥有的 :) - Ray

0

前面的人已经说得很清楚了,但如果你真的想要一行显示,可以这样做:

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

编辑:搞错了顺序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接