2012-04-18 8 views
8

Come posso leggere 3 byte come un numero intero?Reading 3 byte come un numero intero

Vuol modulo struct fornire qualcosa di simile?

Posso leggere in 3 byte e aggiungere un \ x00 extra e quindi interpretarlo come un intero di 4 byte, ma ciò sembra non necessario.

+4

Assicurati di aggiungere il NUL alla fine giusto ... –

risposta

11

Il modulo struct non ha opzioni per interi a 3 byte, quindi penso che la tua idea di aggiungere '\ x00' sia il modo più semplice.

In [30]: import struct 
In [38]: struct.pack('>3b',0,0,1) 
Out[38]: '\x00\x00\x01' 

In [39]: struct.unpack('>i','\x00'+'\x00\x00\x01') 
Out[39]: (1,) 
+1

+ 1 per struct ... – chespinoza

2

An alternativa per python 2 e senza il modulo struct:

>>> s = '\x61\x62\xff' 
>>> a = sum([ord(b) * 2**(8*n) for (b, n) in zip(s, range(len(s))[::-1])]) 
>>> print a 
6382335 

dove l'ordine dei byte è big-endian. Questo dà lo stesso risultato con unutbu risposta:

>>> print struct.unpack('>I', '\x00' + s)[0] 
6382335 

Per little-endian ordinare la conversione sarebbe:

>>> a = sum([ord(b) * 2**(8*n) for (b, n) in zip(s, range(len(s)))]) 
>>> print a 
16736865 
>>> print struct.unpack('<I', s + '\x00')[0] 
16736865 
Problemi correlati