2016-02-21 3 views
3

Использование Python 2.7 Я имел этот код:распаковывать Ошибка требует строковый аргумент длины 16

#Create a random 56 bit (7 byte) string 
random_bytes = os.urandom(7) 
random_bytes = int.from_bytes(random_bytes, byteorder="big") 

Что дает ошибку:

AttributeError: type object 'int' has no attribute 'from_bytes'

После чтения онлайн он выглядит from_bytes является Python 3. Так что я попытался следующее:

random_bytes = os.urandom(7) 
    #random_bytes = int.from_bytes(random_bytes, byteorder="big") 
    random_bytes = struct.unpack('>16B', random_bytes) 

Но это дает следующее сообщение об ошибке:

struct.error: unpack requires a string argument of length 16

Должно ли >16B быть >7B? Даже при этом кажется, что он возвращает кортеж.

Цель состоит в том, чтобы использовать random_bytes как это:

int(str(((time_bytes << 56) | random_bytes)) + code) 
+0

http://stackoverflow.com/questions/30402743/python-2-7-equivalent-of-built-in-method-int-from-bytes это помогает? – timgeb

+0

@timgeb Нет, я уверен, '' struct.unpack'' - путь сюда – Prometheus

+1

Вы просите структуру распаковать последовательность из 7 байтов в кортеж из 16, 8 битных целых чисел ... – thebjorn

ответ

1

Может быть, это будет работать для вас:

r = chr(0) + os.urandom(7) # pad with zeroes 
struct.unpack('>q', r) 

q быть код для подписанного 8-байтного inte ger (Q без знака).

В результате получается кортеж с одним элементом.

2

Может быть, это поможет:

import os 

binary = os.urandom(7) 
result = int(binary.encode('hex'), 16) 
Смежные вопросы