2010-12-13 10 views
6

estoy convirtiendo la cadena siguiente a que es la representación de entero sin signo:¿La forma más corta de convertir estos bytes a int en python?

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

puedo usar struct.unpack('8B', str) para obtener la representación tupla (0,0,0,0,0,0,1,255), pero lo que es la forma más rápida/más fácil de convertir esta tupla a un int?

En este momento, mi código es

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

Pero esto es largo y feo, para una función tan simple! ¡Debe haber una mejor manera! ¿Pueden los gurús de SO Python ayudarme a recortar esto y python-ify?

+0

Psst! ¡Tu función siempre regresará a cero! ¿Puedes ver por qué? –

+0

Además, 'i ++' es una sintaxis inválida (a diferencia de la igualmente sin sentido, pero más furtivo '++ i' que se ejecuta pero no hace nada). – delnan

Respuesta

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

Perfecto, gracias! – linked

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

Struct puede tratar con longitudes largas de 8 bytes directamente.

+0

Gracias por la respuesta, pero en la práctica, su "<" parece ser incorrecta (me da una respuesta en millones, supongo que esto es por una larga duración)? – linked

+1

@linked: '<' es para little-endian (es decir, el bit más a la derecha es el más significativo), '>' es para big-endian (es decir, el bit más a la izquierda es el más significativo). 'q' es para (firmado)' long long'. – delnan

2

Sólo descomprimir como un largo (entero de 64 bits) de largo:

struct.unpack('>Q', str) 

Q = unsigned long long. Cambie al q si la cadena representa un largo firmado.

El > indica el orden de bytes de big-endian. Use < para indicar el orden de byte little-endian.

0

Tengo que estar de acuerdo con el comentario long and ugly. ignorando por completo la opción Q/q struct.unpack:

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

La segunda línea pasada podría haber utilizado los operadores bit-bashing:

r = (r << 8) | b 
Cuestiones relacionadas