Wie man Bytes in Ganzzahlen konvertiert in Python

Jinku Hu 10 Oktober 2023
  1. Python 2.7 Bytes
  2. Python 3 Bytes
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.

  1. > zeigt an, dass die Binärdaten Big-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.
  2. HH bedeutet, dass es zwei Objekte vom Typ H in der Bytes-Zeichenkette gibt. H steht für eine unsigned 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.

Warning
Die durch den Formatstring dargestellte Datenlänge muss mit den angegebenen Daten übereinstimmen, andernfalls wird ein Fehler gemeldet.
>>> 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.

Info
Die Darstellung der Bytes wird in eine Ganzzahl.

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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - Python Bytes