2011-07-29 5 views
4

UUID.intを使用して構造体にパッキングしようと思っていたUUIDがあります.UUID.intは128ビット整数に変換されます。しかし、構造体フォーマット文字のどれもそれを格納するのに十分な大きさではありません。Pythonで構造体にUUIDをパックするには?

サンプルコード:

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

問題は、構造体の形式「L」が唯一の4バイトである。私は、32文字の文字列として格納することははるかにビットである16を格納する必要があります。

+0

コードサンプルを投稿してください。 –

答えて

10

これは128ビットの整数ですが、どのように変換されると思いますか?いくつかのコンポーネントに分割することができます。 2つの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モジュールを使用しているとして、あなたは、単にビッグエンディアンバイト順の6つの整数フィールドを含む(16バイトの文字列としてUUIDを保持しているbytes部材を使用することができます)

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

しかし、構造体はcharを格納するだけなので、バイトを16個の別個の文字として反復処理する必要があります。開梱したら、再び16文字を入れてください。編集:それはあまりにも文字列を格納できるように見えます、私はこれを試してみましょう。 – nicobatu

+0

私が使用しているPythonのバージョンは、パックで文字列を暗黙的に変換しているようですが、私は長い方が安全です。 – nicobatu

+0

私は問題を見ることができません。 'struct.pack(" 16c "、* [c for packed])と同等の' stuct.pack( "16s"、packed) (あなたの文字列を再コピーします)。 – tomasz

関連する問題