2011-07-29 14 views
4

我有一個UUID,我正在考慮使用UUID.int打包到一個結構中,將它變成一個128位整數。但是沒有一個結構格式字符足夠大來存儲它,如何去做這件事?如何將UUID打包到Python中的結構中?

樣品的編號:

s = struct.Struct('L') 
unique_id = uuid.uuid4()  
tuple = (unique_id.int) 
packed = s.pack(*tuple) 

的問題是,結構格式「L」是隻有4個字節...我需要存儲16中存儲它作爲一個32字符的字符串是有點多。

+0

請發佈您的代碼示例。 –

回答

10

它是一個128位整數,你會期望它變成什麼?您可以將它分成幾個組件 - 例如兩個64位整數:

max_int64 = 0xFFFFFFFFFFFFFFFF 
packed = struct.pack('>QQ', (u.int >> 64) & max_int64, u.int & max_int64) 
# unpack 
a, b  = struct.unpack('>QQ', packed) 
unpacked = (a << 64) | b 

assert u.int == unpacked 
+0

美麗的作品。我在想,使用UUID.bytes可能會有一個更簡單的方法,但是位移已經非常簡單了。 – nicobatu

6

作爲您使用uuid模塊,可以簡單地使用bytes構件,其保持UUID作爲16字節的字符串(包含在大端字節序的六個整數字段)

u = uuid.uuid4() 
packed = u.bytes # packed is a string of size 16 
assert u == uuid.UUID(bytes=packed) 
+0

但是由於struct只能存儲一個字符,所以我必須以16個獨立字符遍歷字節。然後拆包時,再放16個字符。編輯:看起來它可以存儲一個字符串,我會試試這個。 – nicobatu

+0

我使用的Python版本似乎也在包中使用字符串進行一些隱式轉換,我認爲使用long的安全性更高。 – nicobatu

+0

我看不出有什麼問題,你應該用'stuct.pack(「16s」,packed)'''''''''''''''''''''''' (並且會重新複製你的字符串)。 – tomasz

相關問題