Ich habe einen langen bytearrayKonvertieren in short int in Python bytearray
barray=b'\x00\xfe\x4b\x00...
Was wäre der beste Weg, sei es von 2-Byte-Zahlen auf eine Liste zu konvertieren?
Ich habe einen langen bytearrayKonvertieren in short int in Python bytearray
barray=b'\x00\xfe\x4b\x00...
Was wäre der beste Weg, sei es von 2-Byte-Zahlen auf eine Liste zu konvertieren?
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)
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])
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)
@NabIlovich Das ist kein Duplikat. Ganz anderer Anwendungsfall. – viraptor