Extracting 3-byte integers
Scott David Daniels
scott.daniels at acm.org
Mon Jun 26 20:57:50 EDT 2006
Bob Greschke wrote:
> I have some binary data read from a file that is arranged like
> <3-byte int> <3-byte int> <3-byte int> etc.
> The "ints" are big-endian and there are 169 of them. Is there any clever
> way to convert these to regular Python ints other than (struct) unpack'ing
> them one at a time and doing the math?
Best way is with scipy (or Numeric or numarray), but for vanilla Python:
import array, itertools
ubytes = array.array('B')
sbytes = array.array('b')
ubytes.fromfile(binarysource, 169 * 3)
sbytes.fromstring(ubytes[::3].tostring())
result = array.array('i', (msb * 256 + mid) * 256 + lsb
for msb, mid, lsb
in itertools.izip(sbytes,
ubytes[1::3], ubytes[2::3])))
If you want to get fancy, you can replace the last statement with:
del ubytes[::3]
uhalf = array.array('H')
uhalf.fromstring(ubytes.tostring())
if array.array('H', [1]) != '\x00\x01': uhalf.byteswap()
result = array.array('i', (msb * 65536 + low for msb, low
in itertools.izip(sbytes, uhalf)))
That was fun.
--Scott David Daniels
scott.daniels at acm.org
More information about the Python-list
mailing list