Как упаковать UUID в структуру в Python? - PullRequest
5 голосов
/ 29 июля 2011

У меня есть UUID, который я собирался упаковать в структуру, используя UUID.int, что превращает его в 128-разрядное целое число. Но ни один из символов формата структуры не достаточно велик для его хранения, как это сделать?

Пример кода:

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

Проблема в том, что формат структуры 'L' составляет всего 4 байта ... Мне нужно сохранить 16. Хранить его как 32-символьную строку довольно много.

Ответы [ 2 ]

12 голосов
/ 29 июля 2011

Это 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
7 голосов
/ 29 июля 2011

Поскольку вы используете модуль uuid, вы можете просто использовать элемент bytes, который содержит UUID в виде 16-байтовой строки (содержащей шесть целых полей в порядке старших байтов) :

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