将32位数字拆分为各个字段
有没有什么简单的方法可以在Python中把一个32位的变量,比如说a1a2a3a4
,快速分成a1
、a2
、a3
和a4
呢?我之前是把这个值先转换成十六进制,然后再分开,但感觉这样做有点浪费时间,因为要先变成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'
将其“解包”成四个无符号的字节值。非常简单。