2010-12-13 6 views
6

jestem konwersji następujący ciąg To unsigned reprezentacja całkowita:Najkrótszy sposób konwertowania tych bajtów na int w pythonie?

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

mogę używać struct.unpack('8B', str) uzyskać reprezentację krotny (0,0,0,0,0,0,1,255), ale co to najszybsza/Najprostszym sposobem, aby przekonwertować ten krotki do int?

Teraz, mój kod jest

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

Ale to długa i brzydkie, dla takiej prostej funkcji! Musi istnieć lepszy sposób! Czy każdy guru Pythona SO może mi pomóc to przyciąć i python-ify it?

+0

Psst! Twoja funkcja zawsze zwróci zero! Czy widzisz, dlaczego? –

+0

Ponadto, 'i ++' jest nieprawidłową składnią (w przeciwieństwie do równie mało znaczącego, ale bardziej podstępnego '++ i', które działa, ale nie robi nic). – delnan

Odpowiedz

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

Idealne, dzięki! – linked

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

Structure może pracować z długością 8 bajtów bezpośrednio.

+0

Dzięki za odpowiedź, ale w praktyce twoje "<" wydaje się być nieprawidłowe (daje mi odpowiedź w milionach, przypuszczam, że to jest dla podpisanego longlonga?) – linked

+1

@ linked: '<' jest dla little-endian (tzn. najbardziej prawy bit jest najbardziej znaczący), '>' jest dla big-endian (tzn. najbardziej lewy bit jest najbardziej znaczący). 'q' jest dla (podpisane)' long long'. – delnan

2

tylko rozpakowania jako dłuższy długi (64-bitową liczbę całkowitą)

struct.unpack('>Q', str) 

Q = unsigned long długości. Przełącz na q, jeśli ciąg reprezentuje długą długą metę.

Oznaczenie > wskazuje na dużą liczbę bajtów. Użyj wartości <, aby wskazać kolejność bajtów z małych endianów.

0

Muszę zgodzić się z komentarzem . Całkowicie ignorując struct.unpack opcję Q/Q:

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

przedostatnią linię mogła wykorzystać operatory bitowe-walnąć:

r = (r << 8) | b 
Powiązane problemy