2017-07-19 4 views

Antwort

2

Mit dem struct Modul:

import struct 

count = len(barray)/2 
integers = struct.unpack('H'*count, barray) 

auf dem endianness Je Sie können eine < oder > für das Auspacken Format vorangestellt werden soll. Und abhängig von signed/unsigned ist es h oder H.

+0

Das ist es, vielen Dank! – Sparks

0

können Sie die für das struct Paket verwenden:

from struct import unpack 

tuple_of_shorts = unpack('h'*(len(barray)//2),barray) 

Diese unterzeichnet Shorts produzieren wird. Für unsigned diejenigen, verwenden 'H' statt:

tuple_of_shorts = unpack('H'*(len(barray)//2),barray) 

Dieses auf einem Eingang Little-Endian Maschine für Ihre Probe erzeugt:

>>> struct.unpack('h'*(len(barray)//2),barray) 
(-512, 75) 
>>> struct.unpack('H'*(len(barray)//2),barray) 
(65024, 75) 

Falls Sie wollen arbeiten mit Big-Endian- oder Little Endian, können Sie eine > (Big Endian) oder < (Little Endian) in den Spezifikationen setzen. Zum Beispiel:

# Big endian 
tuple_of_shorts = unpack('>'+'H'*(len(barray)//2),barray) # unsigned 
tuple_of_shorts = unpack('>'+'h'*(len(barray)//2),barray) # signed 

# Little endian 
tuple_of_shorts = unpack('<'+'H'*(len(barray)//2),barray) # unsigned 
tuple_of_shorts = unpack('<'+'h'*(len(barray)//2),barray) # signed 

generiert:

>>> unpack('>'+'H'*(len(barray)//2),barray) # big endian, unsigned 
(254, 19200) 
>>> unpack('>'+'h'*(len(barray)//2),barray) # big endian, signed 
(254, 19200) 
>>> unpack('<'+'H'*(len(barray)//2),barray) # little endian, unsigned 
(65024, 75) 
>>> unpack('<'+'h'*(len(barray)//2),barray) # little endian, signed 
(-512, 75) 
0

Wenn Speichereffizienz ein Anliegen ist, können Sie erwägen, ein array.array mit:

>>> barr = b'\x00\xfe\x4b\x00' 
>>> import array 
>>> short_array = array.array('h', barr) 
>>> short_array 
array('h', [-512, 75]) 

Dies wie ein platzspar primitives Array ist, mit einem OO-Wrapper, so unterstützt es Sequenz-Typ-Methoden, die Sie auf eine list, wie .append, .pop, und Slicing haben würde!

>>> short_array[:1] 
array('h', [-512]) 
>>> short_array[::-1] 
array('h', [75, -512]) 

Auch wird Ihr bytes Objekt erholt trivial:

>>> short_array 
array('h', [-512, 75]) 
>>> short_array.tobytes() 
b'\x00\xfeK\x00' 

Hinweis, wenn Sie das Gegenteil endianness von der nativen Byte-Reihenfolge möchten, verwenden Sie die in-place byteswap Methode:

>>> short_array.byteswap() 
>>> short_array 
array('h', [254, 19200]) 
0

Hinweis: Mit der Bibliothek Python struct zum Konvertieren Ihres Arrays können Sie auch eine Wiederholungsanzahl für jedes Element im Formular angeben bei Spezifizierer. So wäre beispielsweise 4H dasselbe wie die Verwendung von HHHH.

Mit diesem Ansatz vermeidet die Notwendigkeit, potentiell massiven Formatstrings zu erstellen:

import struct 

barray = b'\x00\xfe\x4b\x00\x4b\x00' 
integers = struct.unpack('{}H'.format(len(barray)/2), barray) 

print(integers) 

Geben Sie:

(65024, 75, 75) 
Verwandte Themen