将32位数字分成单个字段

时间:2010-01-26 12:43:40

标签: python

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

4 个答案:

答案 0 :(得分:13)

标准库模块struct做了简短的工作:

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

“打包”使得x成为一个4字节的大端顺序字符串,然后可以立即“解压缩”为四个无符号字节大小的值,格式为{{ 1}}。容易腻。

答案 1 :(得分:6)

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

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

正如SilentGhost所指出的,你不需要int转换,所以你可以这样做:

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

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

答案 2 :(得分:4)

使用按位操作。

例如:

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

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

答案 3 :(得分:0)

有点太晚但我通常会这样做:

hexnum = 0xa1a2a3a4
bytes = []
while (hexnum > 0):
    bytes.insert(0, hexnum & 0xff)
    hexnum >>= 8

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