2010-01-26 27 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的())。