2010-01-26 28 views
3

是否有蟒蛇的快捷方式到32位变量,也就是说,a1a2a3a4分成a1a2a3a4快?我已经通过将值更改为十六进制然后分割它来完成它,但是看起来像浪费时间做int - >string - >int打破了32位数字分成单独的域

+0

请解释一下你认为Python“32位变量”是什么。如果你假设它的值是无符号的,那就这么说吧。如果不是,请解释你想要的结果。 – 2010-01-26 13:39:31

+0

我想它是无符号的,因为没有任何值的原因是否定的。 我的意思是a1,a2就像是一个大变量/字符串事物中的索引。我应该把x1x2x3x4,但这同样适用。即时尝试写入CAST128,并在其中的一部分,临时字节存储在x1x2x3 ... x16,z1z2 ... z16。我将如何在一次4操作并更新它们? – calccrypto 2010-01-26 14:29:13

回答

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,否则为int。第一个版本总是返回int。在较新版本的Python中,这两种类型是unified,因此您不必担心这些细节。

+0

你为什么要做'int'转换? – SilentGhost 2010-01-26 12:51:36

+0

SilentGhost:因为他可能会使用Python 2.x,他可能希望将结果作为一个int,而不是很长。这不是必要的,但它也不会受伤。如果您愿意,欢迎您省略int转换。 – 2010-01-26 12:53:16

+0

沉默的幽灵:我现在已经发布了两个版本。 :) – 2010-01-26 12:55:49

4

使用按位运算。

例如:

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

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

13

标准库模块struct做的是短期工作:

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

“包装”与格式'>I'使得x到大端顺序的4字节的字符串,然后可以立即“解包”成四个无符号字节大小值,格式为'4B'。十分简单。

+0

+1不知道。 – 2010-01-26 22:33:44

+0

我知道这是一个旧帖子,但对于任何正在看这个的人 - 这在Python 3中不起作用。TypeError:'int'不支持缓冲接口 – ThatAintWorking 2016-04-01 21:25:14

+0

@ThatAintWorking Pardon?如果将一个整数传递给'struct,那么只会在这里引发TypeError。解压()'(因此,你知道错误文本提到一个int ...),但是如果你注意到,这个答案不会发生,因为struct.pack()总是返回一个字符串...所以它可以像预期的那样100%工作,即使在Python 3中也是如此。我假设你接受了嵌套包,并试图将一个整数直接传递给'struct.unpack()'而不会注意到? – 2017-12-22 06:40:30

0

有点晚,但我平时做这样的事情:

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

不知道但如果它的效率更高,然后解压缩与否(可能不是由于使用list.insert的())。