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