Wie man Bytes in Ganzzahlen konvertiert in Python
Der Datentyp Bytes hat einen Wert von 0 bis 255 (0x00 bis 0xFF). Ein Byte hat 8 Bits, deshalb ist sein maximaler Wert 0xFF. In einigen Fällen müssen Sie Bytes oder Bytes-Array für die weitere Datenverarbeitung in Ganzzahlen konvertieren. Dieser kurze Artikel stellt vor, wie man die Umwandlung von Bytes in Ganzzahlen durchführen kann.
Python 2.7 Bytes
Es gibt keinen eingebauten Bytes Datentyp in Python 2.7 Version. Das Schlüsselwort byte ist identisch mit str.
>>> bytes is str
True
Bytearray wird verwendet, um ein Bytes oder Byte-Array Objekt zu definieren.
>>> byteExample1 = bytearray([1])
>>> byteExample1
bytearray(b'\x01')
>>> byteExample2 = bytearray([1,2,3])
>>> byteExample2
bytearray(b'\x01\x02\x03')
Bytes in Ganzzahlen konvertieren in Python 2.7
Das Python-interne Modul struct konnte binäre Daten (Bytes) in Ganzzahlen konvertieren. Es könnte Bytes oder tatsächlich Zeichenketten in Python 2.7 und Integer in einer bidirektionalen Weise konvertieren.
struct.unpack(fmt, string)
# Convert the string according to the given format `fmt` to integers. The result is a tuple even if there is only one item inside.
struct Beispiele
import struct
testBytes = b"\x00\x01\x00\x02"
testResult = struct.unpack(">HH", testBytes)
print testResult
(1, 2)
Der Formatstring >HH besteht aus zwei Teilen.
>zeigt an, dass die BinärdatenBig-Endiansind, oder anders gesagt, die Daten werden vom Big-End (höchstwertiges Bit) aus geordnet. Zum Beispiel bedeutet\x00\0x1, dass\x00ein High-Byte und\x01ein Low-Byte ist.HHbedeutet, dass es zwei Objekte vom TypHin der Bytes-Zeichenkette gibt.Hsteht für eineunsigned shortGanzzahl, die 2 Bytes benötigt.
Man koennte verschiedene Ergebnisse von der gleichen Zeichenkette erhalten, wenn das zugewiesene Datenformat unterschiedlich ist.
>>> testResult = struct.unpack('<HH', testBytes)
>>> testResult
(256, 512)
Hier bedeutet <, dass die Endlosigkeit kleines Endian ist. Daher wird \x00\x01 zu 00+1*256 = 256, nicht mehr 0*256+1 = 1.
>>> testResult = struct.unpack('<BBBB', testBytes)
>>> testResult
(0, 1, 0, 2)
B bedeutet, dass die Daten unsigned char sind und 1 Byte benötigen. Daher wird \x00\x01\x00\x02 in 4 Werte von unsigned char konvertiert, nicht mehr 2 Werte von unsigned short.
>>> testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')
error: unpack requires a string argument of length 3
Sie könnten das offizielle Dokument des struct Moduls überprüfen, um mehr Informationen über format strings zu erhalten.
Python 3 Bytes
Bytes ist ein eingebauter Datentyp in Python 3, daher können Sie Bytes direkt mit dem Bytes Schlüsselwort definieren.
>>> testByte = bytes(18)
>>> type(testByte)
<class 'bytes'>
Sie könnten auch direkt ein Bytes oder Bytes-Array wie unten definieren,
>>> testBytes = b'\x01\x21\31\41'
>>> type(testBytes)
<class 'bytes'>
Bytes in Ganzzahlen konvertieren in Python 3
Neben dem bereits in Python 2.7 eingefuehrten struct Modul koennen Sie auch die neue in Python 3 eingebaute Integer-Methode verwenden, um die Konvertierung von Bytes in Ganzzahlen vorzunehmen, d.h. die int.from_bytes() Methode.
int.from_bytes() Beispiele
>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big')
61712
Die byteorder Option ist ähnlich der struct.unpack() Format-Byte-Order-Definition.
int.from_bytes() hat eine dritte Option signed, um den Integer-Typ, der signed oder unsigned sein soll, zuzuweisen.
>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big', signed=True)
-3824
Benutze [] wenn Bytes unsigned chart ist
Wenn das Format der Daten das Format von unsigned char hat, das nur ein Byte enthält, könnten Sie direkt den Objektindex verwenden, um auf die Daten zuzugreifen und auch den Integer der Daten zu erhalten.
>>> testBytes = b'\xF1\x10'
>>> testBytes[0]
241
>>> testBytes[1]
16
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook