navigation Navigation


Inhaltsverzeichnis

bytes()


Die eingebaute Funktion bytes() erzeugt unveränderliche Byte-Sequenzen und ist zentral für die Arbeit mit binären Daten in Python — etwa bei Datei‑ und Netzwerk‑I/O, Kryptographie und Kodierungsaufgaben. bytes() lässt sich aus Integer‑Iterables, aus einem bytearray, aus einem Text‑String (mit angegebenem encoding) oder leer mit einer bestimmten Länge erstellen. Da bytes immutable sind, sind sie als schreibgeschützte Puffer und Schlüssel geeignet; für Änderungen muss man vorher in ein bytearray konvertieren. In diesem Artikel behandeln wir Syntax, Erzeugungswege, typische Encoding‑Fallstricke und praxisnahe Beispiele zur effizienten Verarbeitung von Binärdaten.

Inhaltsverzeichnis

    Einführung

    Die bytes Klasse ist einer der eingebauten Datentypen in Python und spielt eine zentrale Rolle bei der Arbeit mit Binärdaten. Sie repräsentiert unveränderliche (immutable) Sequenzen von Bytes und ist essentiell für die Verarbeitung von Rohdaten, Netzwerkkommunikation, Dateioperationen und der Interaktion zwischen verschiedenen Zeichenkodierungen.

    Beschreibung

    Was ist bytes?

    Die bytes Klasse repräsentiert eine unveränderliche Sequenz von Bytes, wobei jedes Byte einen Wert zwischen 0 und 255 (8 Bit) haben kann. Im Gegensatz zu Strings, die Text in Unicode-Zeichen darstellen, arbeitet bytes mit rohen Binärdaten.

    Welches Problem wird gelöst?

    In der modernen Programmierung müssen wir häufig zwischen verschiedenen Datenrepräsentationen wechseln.

    • Text vs. Binärdaten: Strings sind für Menschen lesbar, aber Computer arbeiten mit Bytes.
    • Zeichenkodierungen: Verschiedene Systeme verwenden unterschiedliche Kodierungen (UTF-8, ASCII, Latin-1, etc.)
    • Netzwerkkommunikation: Daten werden über Netzwerke als Byte-Streams übertragen.
    • Dateioperationen: Binärdateien (Bilder, PDFs, etc.) müssen als Bytes verarbeitet werden.
    • Kryptographie: Verschlüsselung und Hashing arbeiten mit Byte-Daten.

    Syntax

    Die bytes Klasse hat mehrere Konstruktor-Signaturen.

    Die erste Signatur: Leer oder aus verschiedenen Quellen.

    Syntax
    bytes(source=b"")

    Die zweite Signatur: Aus String mit Kodierung.

    Syntax
    bytes(source, encoding, errors="strict")

    Zusätzliche Möglichkeiten:

    Syntax
    bytes()                         # Leeres byte-Objekt
    bytes(integer)                  # Bytes mit Nullen der angegebenen Länge
    bytes(iterable)                 # Bytes aus iterierbarem Objekt
    bytes(buffer)                   # Bytes aus Objekt mit Buffer-Protokoll
    bytes(string, encoding)         # Bytes aus String
    bytes(string, encoding, errors) # Bytes aus String mit Fehlerbehandlung
    source

    Der source Parameter kann verschiedene Typen annehmen (siehe weiter unten)


    encoding

    Gibt die Zeichenkodierung an, die verwendet werden soll


    errors

    Definiert, wie mit Kodierungsfehlerns umgegangen werden soll


    Parameter-Beschreibung

    Im Folgenden werden die Parameter etwas genauer beschrieben/erklärt.

    Parameter source

    Dieser Parameter kann verschiedene Typen annehmen.

    Keine Angabe oder b''

    • Erzeugt ein leeres bytes Objekt
    • Standard-Fallback-Wert
    my_bytes = bytes()
    my_bytes = bytes(b"")

    Integer

    • Erzeugt ein bytes Objekt der angegebenen Länge
    • Alle Bytes werden mit Nullen initialisiert
    • Der Integer muss nicht-negativ sein
    my_bytes = bytes(4) # b'\x00\x00\x00\x00'

    Iterable von Integers

    • Jedes Element muss ein Integer zwischen 0 und 255 sein
    • Erzeugt ein bytes Objekt mit diesen Werten
    bytes([2, 4, 6]) # b'\x02\x04\x06'

    String (nur mit Encoding)

    • Wandelt einen String in Bytes um
    • Erfordert den encoding Parameter
    • Der String wird gemäß der angegebenen Kodierung in Bytes übersetzt
    my_bytes = bytes("Hello", "utf-8") # b'Hello'

    Objekt mit Buffer-Protokoll

    • Andere bytes, bytearray oder buffer-unterstützende Objekte
    • Erstellt eine Kopie der Bytes

    Parameter encoding

    Dieser Parameter gibt die Zeichenkodierung an, die verwendet werden soll.

    Folgende Werte sind unter Anderem möglich:

    • utf-8: Unicode-Kodierung (Standard für moderne Anwendungen)
    • ascii: 7-Bit ASCII (nur 0-127)
    • latin-1 oder iso-8859-1: 8-Bit westeuropäische Zeichen
    • utf-16, utf-32: Andere Unicode-Kodierungen
    • cp1252: Windows Western European

    Viele weitere sind verfügbar.


    Parameter errors

    Mit diesem Parameter wird definiert, wie mit Kodierungsfehlern umgegangen werden soll.

    Folgende Werte sind möglich:

    • strict: Wirft UnicodeEncodeError bei ungültigen Zeichen (Standard)
    • ignore: Ignoriert ungültige Zeichen
    • replace: Ersetzt ungültige Zeichen durch ein Ersatzzeichen
    • xmlcharrefreplace: Ersetzt durch XML-Zeichen-Referenz
    • backslashreplace: Ersetzt durch Backslash-Escape-Sequenzen
    • namereplace: Ersetzt durch \N{...} Escape-Sequenzen

    Rückgabewert

    Die bytes() Funktion gibt es unveränderliches bytes Objekt zurück.

    Dieses Objekt:

    • Ist eine Sequenz von Bytes (Werte 0 - 255)
    • Ist immutable (unveränderlich)
    • Kann indexiert und gesliced werden
    • Unterstützt viele String-ähnliche Methoden
    • Hat einen anderen Typ als str und bytearray

    Unveränderlichkeit

    Ein bytes Objekt kann nach der Erstellung nicht mehr verändert werden. Dies unterscheidet es von bytearray, dem veränderbaren Pendant.

    Dieses Unveränderlichkeit macht bytes hashbar (kann als Dictionary-Key verwendet werden) und thread-safe, führt aber dazu, dass jede “Änderung” ein neues Objekt erstellt.

    Beispiel
    b = bytes([60, 70, 80])
    b[0]= 100
    TypeError: 'bytes' object does not support item assignment

    Literal-Syntax

    Python bietet eine spezielle Literal-Syntax für bytes. Das b-Präfix vor einem String-Literal erzeugt direkt ein bytes Objekt. Nur ASCII-Zeichen (0-127) sind in Literalen erlaubt, andere Zeichen müssen escaped werden.

    Das ist möglich.

    Beispiel
    b1 = b"Hallo Python"
    b2 = b"Coding"
    b3 = b"""Multi
    line of
    code"""
    
    print(b1)
    print(b2)
    print(b3)
    b'Hallo Python'
    b'Coding'
    b'Multi\nline of\ncode'

    Hier kriegen wir einen Fehler aufgrund von ö.

    Beispiel
    b = b"Python is schön"
    SyntaxError: bytes can only contain ASCII literal characters

    Darstellung und Ausgabe

    Die String-Repräsentation von bytes zeigt lesbare ASCII-Zeichen als Text und andere als Hex-Werte.

    Beispiel
    b = bytes([72, 101, 108, 108, 111, 32, 255, 0, 10])
    print(b)
    b'Hello \xff\x00\n'
    • ASCII-Zeichen (32-126) werden als Zeichen dargestellt. (Hello)
    • Nicht-druckbare Zeichen als Hex: \xff (255) und \x00 (0)

    Praktische Beispiele

    Konvertierung zwischen bytes und str

    Die Umwandlung zwischen Text (str) und Binärdaten (bytes) ist eine der häufigsten Operationen.

    Beispiel
    text = "Hallo Welt 🌍"
    
    b1 = text.encode("utf-8")
    print(b1)
    
    b2 = bytes(text, "utf-8")
    print(b2)
    
    text_back = b1.decode("utf-8")
    print(text_back)
    b'Hallo Welt \xf0\x9f\x8c\x8d'
    b'Hallo Welt \xf0\x9f\x8c\x8d'
    Hallo Welt 🌍

    Kurze Ausführungen zu diesem Beispiel.

    • Das Emoji 🌍 wird in UTF-8 als 4 Bytes kodiert: \xf0\x9f\x8c\x8d
    • encode() ist eine String-Methode, während bytes() ein Konstruktor ist
    • decode() ist eine Umkehrung und wandelt Bytes zurück in String um
    • Beide Richtungen benötigen die Angabe einer Kodierung

    Fehlerbehandlung

    Nun schauen wir uns an, wie man mit Encoding-Fehlern umgehen kann.

    Zuerst versuchen wir den Fehler abzufangen.

    Beispiel
    text = "Café"
    
    try:
        b = bytes(text, "ascii")
    except UnicodeEncodeError as e:
        print(f"Fehler: {e}")
    Fehler: 'ascii' codec can't encode character '\xe9' in position 3: ordinal not in range(128)

    Der Buchstabe é kann nicht mittels ASCII korrekt ausgegeben bzw. interpretiert werden. Deswegen wird hier der Fehler geworfen.


    Im nächsten Beispiel schauen wir uns an, wie wir den Fehler einfach ignorieren können und nur das ausgeben, was korrekt verarbeitet werden kann.

    Beispiel
    text = "Café"
    
    b_with_ignore = bytes(text, "ascii", errors="ignore")
    print(b_with_ignore)
    b'Caf'

    Wie wir hier sehen, wir der Buchstabe é einfach ignoriert.


    Wir können auch Zeichen, welche bei einer bestimmten Kodierung nicht korrekt verarbeitet werden, durch ein Zeichen ersetzen.

    Beispiel
    text = "Café"
    
    b_with_replace = bytes(text, "ascii", errors="replace")
    print(b_with_replace)
    b'Caf?s'

    Leere Objekte

    Werfen wir einen Blick auf die Erstellung von leeren Objekten mit bytes().

    Beispiel
    b1 = bytes()
    b2 = bytes(b"")
    b3 = b""
    
    print(b1)
    print(len(b1))
    print(b1 == b2 == b3)
    print(type(b1))
    b''
    0
    True
    <class 'bytes'>