将32位数字拆分为各个字段

5 投票
4 回答
9474 浏览
提问于 2025-04-15 18:29

有没有什么简单的方法可以在Python中把一个32位的变量,比如说a1a2a3a4,快速分成a1a2a3a4呢?我之前是把这个值先转换成十六进制,然后再分开,但感觉这样做有点浪费时间,因为要先变成int,再变成string,最后再变回int

4 个回答

5

使用位运算。

举个例子:

myvar = 0xcdf100cd
a0 = myvar & 0xff
a1 = (myvar >> 8) & 0xff
a2 = (myvar >> 16) & 0xff
a3 = (myvar >> 24) & 0xff

这里的 &0xff 是用来保留数值的最低8位,而把其他的位都变成0。位移运算符(>>)则是用来把你提取的字节移动到这最低的8位里。

7

在Python中,其实并没有所谓的32位变量。你是这个意思吗?

x = 0xa1a2a3a4
a4 = int(x & 0xff)
a3 = int((x >> 8) & 0xff)
a2 = int((x >> 16) & 0xff)
a1 = int(x >> 24)

正如SilentGhost所说,你不需要进行整数转换,所以你可以这样做:

a4 = x & 0xff
a3 = (x >> 8) & 0xff
a2 = (x >> 16) & 0xff
a1 = x >> 24

需要注意的是,在旧版本的Python中,如果x的值大于0x7fffffff,第二种写法会返回长整型(long),否则返回整型(int)。而第一种写法总是返回整型。在新版的Python中,这两种类型已经被合并了,所以你不需要担心这个细节。

15

标准库模块 struct 可以很简单地处理这个问题:

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

使用格式 '>I' 进行“打包”,可以把 x 转换成一个4字节的字符串,采用大端字节序。然后,我们可以立即用格式 '4B' 将其“解包”成四个无符号的字节值。非常简单。

撰写回答