Reading 3 bytes as an integer

How can I read 3 bytes as an integer?

Does the struct module provide something like this?

I can read 3 bytes and add an extra \ x00, and then interpret it as a 4-byte integer, but that seems unnecessary.

+8
python
source share
3 answers

There is no option for 3 byte integers in the struct module, so I think your idea of ​​adding \ x00 is the easiest way.

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,) 
+11
source share

I think from 3.2, int developed a new .from_bytes method, so you can use the following instead of struct.unpack :

 int.from_bytes(b'\x00\x00\x01', 'big') # 1 

For reference see: http://docs.python.org/dev/library/stdtypes.html#int.from_bytes

+4
source share

An alternative for python 2 and without a struct module would be:

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

where the byte order is big-endian. This gives the same result as unutbu's answer:

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

To order the low byte, the conversion will be:

 >>> 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 
+2
source share

All Articles