2010-12-13 11 views
6

Ich Umwandlung der folgenden Zeichenfolge es Darstellung unsigned integer ist:Kürzeste Möglichkeit, diese Bytes in Python in int zu konvertieren?

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

I struct.unpack('8B', str) können die Tupel Darstellung (0,0,0,0,0,0,1,255), zu bekommen, aber was ist der schnellste/einfachste Weg, dieses Tupel in einen int zu konvertieren?

Gerade jetzt, mein Code ist

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

Aber das ist lang und hässlich, für eine solche einfache Funktion! Es muss einen besseren Weg geben! Können mir irgendwelche SO-Python-Gurus helfen, das herunterzuspielen und Python-ify?

+0

psst! Ihre Funktion gibt immer Null zurück! Kannst du sehen warum? –

+0

Außerdem ist 'i ++' eine ungültige Syntax (im Gegensatz zu dem ebenfalls bedeutungslosen, aber hinterhältigen '++ i', das läuft, aber nichts tut). – delnan

Antwort

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

Perfekt, danke! – linked

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

Struct kann direkt mit 8 Byte langen Longs umgehen.

+0

Danke für die Antwort, aber in der Praxis scheint Ihr "<" falsch zu sein (gibt mir eine Antwort in Millionen, ich nehme an, das ist für eine signierte LongLong?) – linked

+1

@linked: '<' ist für Little-Endian (dh das äußerste rechte Bit ist am wichtigsten), '>' ist für Big-Endian (dh das am weitesten links liegende Bit ist am signifikantesten). 'q' ist für (signiert)' lang lang'. – delnan

2

auszupacken So wie eine lange langen (64-Bit-Ganzzahl):

struct.unpack('>Q', str) 

Q = unsigned long long. Wechseln Sie zu q, wenn die Zeichenfolge eine lange vorzeichenbehaftete Zeichenfolge darstellt.

Die > gibt Big-Endian-Byte-Reihenfolge an. Verwenden Sie <, um die Little-Endian-Byte-Reihenfolge anzugeben.

0

Ich muss dem long and ugly Kommentar zustimmen. Völlig ignoriert die struct.unpack Q/q Option:

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

Die zweitletzte Zeile konnte Bit-Bashing Operatoren verwendet haben:

r = (r << 8) | b 
Verwandte Themen