将32位数字分成单个字段

cal*_*pto 3 python

是否有蟒蛇一个快速的方法来分割32位的变量,比如a1a2a3a4a1,a2,a3,a4快?我已经通过将值更改为十六进制然后拆分它来完成它,但似乎浪费时间做int- > string- > int.

Ale*_*lli 14

标准库模块结构做了它的简短工作:

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

"包装"与格式'>I'使得x进大端顺序的4字节串,然后可以立即被"解包"与格式4无符号字节大小的值'4B'.十分简单.


Mar*_*ers 6

Python中没有32位变量.你是这个意思吗?

x = 0xa1a2a3a4
a4 = int(x & 0xff)
a3 = int((x >> 8) & 0xff)
a2 = int((x >> 16) & 0xff)
a1 = int(x >> 24)
Run Code Online (Sandbox Code Playgroud)

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

a4 = x & 0xff
a3 = (x >> 8) & 0xff
a2 = (x >> 16) & 0xff
a1 = x >> 24
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*ler 5

使用按位运算。

例如:

myvar = 0xcdf100cd
a0 = myvar & 0xff
a1 = (myvar >> 8) & 0xff
a2 = (myvar >> 16) & 0xff
a3 = (myvar >> 24) & 0xff
Run Code Online (Sandbox Code Playgroud)

&0xff保持值和零,其余的低8位,而位位移运算符(>>)用于你提取字节转移到这些低8位。