2010-12-13 2 views
6

Я преобразование следующей строки это беззнаковое целое представление:Самый короткий способ преобразования этих байтов в int в python?

str = '\x00\x00\x00\x00\x00\x00\x01\xFF'

я могу использовать struct.unpack('8B', str), чтобы получить представление кортежа (0,0,0,0,0,0,1,255), но то, что это самый быстрый/простой способ, чтобы преобразовать этот кортеж к междам?

Прямо сейчас, мой код

def unpack_str(s): 
    i = r = 0 
    for b in reversed(struct.unpack('8B', s)): 
    r += r*2**i 
    i++ 
    return r 

Но это долго и некрасиво, для такой простой функции! Должен быть лучший способ! Могут ли любые гуру SO python помочь мне обрезать это и python-ify?

+0

PSST! Ваша функция всегда будет возвращать ноль! Вы можете понять, почему? –

+0

Кроме того, 'i ++' - это недопустимый синтаксис (в отличие от не менее бессмысленного, но более скрытого '++ i', который работает, но ничего не делает). – delnan

ответ

6
>>> struct.unpack('>q', s)[0] 
511 
+0

Отлично, спасибо! – linked

0
def unpack_str(bytes): 
    return struct.unpack('<q',bytes) 

Структуры могут иметь дело с длинными 8-байтовыми длинными прямыми.

+0

Спасибо за ответ, но на практике ваш «<» кажется неправильным (дает мне ответ в миллионах, я предполагаю, что это для подписанного longlong?) – linked

+1

@linked: '<' для little-endian (т.е. самый правый бит наиболее значителен), '>' для big-endian (т.е. самый левый бит является самым значительным). 'q' для (подписанного)' long long'. – delnan

2

Просто распаковать как длинное долго (64-разрядное целое число):

struct.unpack('>Q', str) 

Q = без знака долго долго. Перейдите к q, если строка представляет собой длинный длинный знак.

> указывает порядок байтов байтов. Используйте <, чтобы указать порядок байтов младшего порядка.

0

Согласен с комментарием long and ugly. Полностью игнорируя struct.unpack варианта Q/Q:

def unpack_str(s): 
    r = 0 
    for b in struct.unpack('8B', s): 
    r = r * 256 + b 
    return r 

предпоследней строки мог бы использовать битовые трепку операторов:

r = (r << 8) | b 
Смежные вопросы