breaking a 32-bit number into individual fields
在python中,是否有一种快速的方法可以将32位变量(例如,
标准库模块结构的作用很短:
1 2 3 4 | >>> import struct >>> x = 0xa1a2a3a4 >>> struct.unpack('4B', struct.pack('>I', x)) (161, 162, 163, 164) |
。
格式为
在Python中没有真正的32位变量。这就是你的意思吗?
1 2 3 4 5 | x = 0xa1a2a3a4 a4 = int(x & 0xff) a3 = int((x >> 8) & 0xff) a2 = int((x >> 16) & 0xff) a1 = int(x >> 24) |
正如SilentGhost指出的,您不需要进行int转换,因此可以执行以下操作:
1 2 3 4 | a4 = x & 0xff a3 = (x >> 8) & 0xff a2 = (x >> 16) & 0xff a1 = x >> 24 |
号
注意,在旧版本的python中,如果x的值大于0x7fffffff,则第二个版本将返回long,否则返回ints。第一个版本总是返回in t。在更新版本的python中,这两种类型是统一的,因此您不必担心这个细节。
使用按位运算。
例如:
1 2 3 4 5 | myvar = 0xcdf100cd a0 = myvar & 0xff a1 = (myvar >> 8) & 0xff a2 = (myvar >> 16) & 0xff a3 = (myvar >> 24) & 0xff |
有点晚了,但我通常这样做:
1 2 3 4 5 | hexnum = 0xa1a2a3a4 bytes = [] while (hexnum > 0): bytes.insert(0, hexnum & 0xff) hexnum >>= 8 |
但不确定它是否更有效,然后解包(可能不是因为使用了list.insert())。