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-Endian
sind, oder anders gesagt, die Daten werden vom Big-End (höchstwertiges Bit) aus geordnet. Zum Beispiel bedeutet\x00\0x1
, dass\x00
ein High-Byte und\x01
ein Low-Byte ist.HH
bedeutet, dass es zwei Objekte vom TypH
in der Bytes-Zeichenkette gibt.H
steht für eineunsigned short
Ganzzahl, 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