关于python:将32位数字分成单个字段

breaking a 32-bit number into individual fields

在python中,是否有一种快速的方法可以将32位变量(例如,a1a2a3a4快速拆分为a1a2a3a4?我通过将值改为十六进制然后将其拆分来完成它,但似乎是在浪费时间执行int->string->int


标准库模块结构的作用很短:

1
2
3
4
>>> import struct
>>> x = 0xa1a2a3a4
>>> struct.unpack('4B', struct.pack('>I', x))
(161, 162, 163, 164)

格式为'>I'的"packing"使x以大尾数顺序变成一个4字节的字符串,然后可以立即用格式'4B'"unpacking"成四个无符号字节大小的值。简单点。


在Python中没有真正的32位变量。这就是你的意思吗?

1
2
3
4
5
x = 0xa1a2a3a4
a4 = int(x & 0xff)
a3 = int((x >> 8) & 0xff)
a2 = int((x >> 16) & 0xff)
a1 = int(x >> 24)

正如SilentGhost指出的,您不需要进行int转换,因此可以执行以下操作:

1
2
3
4
a4 = x & 0xff
a3 = (x >> 8) & 0xff
a2 = (x >> 16) & 0xff
a1 = x >> 24

注意,在旧版本的python中,如果x的值大于0x7fffffff,则第二个版本将返回long,否则返回ints。第一个版本总是返回in t。在更新版本的python中,这两种类型是统一的,因此您不必担心这个细节。


使用按位运算。

例如:

1
2
3
4
5
myvar = 0xcdf100cd
a0 = myvar & 0xff
a1 = (myvar >> 8) & 0xff
a2 = (myvar >> 16) & 0xff
a3 = (myvar >> 24) & 0xff

&0xff保留值的低8位,其余的位归零,而位移位运算符(>>用于将您提取的字节移位到这些低8位。


有点晚了,但我通常这样做:

1
2
3
4
5
hexnum = 0xa1a2a3a4
bytes = []
while (hexnum > 0):
    bytes.insert(0, hexnum & 0xff)
    hexnum >>= 8

但不确定它是否更有效,然后解包(可能不是因为使用了list.insert())。