Bytearray und Bytestring

Aus Micropython
Zur Navigation springen Zur Suche springen

Unterschied zwischen bytes und bytearray in MicroPython[Bearbeiten | Quelltext bearbeiten]

Ich habe diese Frage Chatgpt gestellt und folgende Antwort bekommen:

In MicroPython gibt es zwei wichtige Typen für Binärdaten: bytes und bytearray. Beide speichern Sequenzen von Bytewerten (0–255), unterscheiden sich aber in ihrer Veränderbarkeit.

🧩 bytes (Bytestring)[Bearbeiten | Quelltext bearbeiten]

  • **Typ:** unveränderlich (immutable)
  • **Verhalten:** wie ein String, aber aus Bytewerten
  • **Verwendung:** für konstante oder nicht veränderbare Binärdaten, z. B. Protokollheader, MAC-Adressen, feste Nachrichten

Beispiel[Bearbeiten | Quelltext bearbeiten]

b = b"Hello"                     # Literal
b = bytes([72, 101, 108, 108, 111])
print(b[0])                      # -> 72
b[0] = 65                        # ❌ Fehler: bytes sind unveränderlich

---

🔧 bytearray[Bearbeiten | Quelltext bearbeiten]

  • **Typ:** veränderlich (mutable)
  • **Verhalten:** wie eine Liste von Bytes
  • **Verwendung:** für Datenpuffer, die geändert werden sollen — z. B. bei UART, SPI, I²C oder WLAN

Beispiel[Bearbeiten | Quelltext bearbeiten]

ba = bytearray(b"Hello")
ba[0] = 65                       # ✅ erlaubt, ergibt "Aello"
print(ba)

Konvertierung[Bearbeiten | Quelltext bearbeiten]

bytes(ba)       # -> b"Aello"
bytearray(b)    # -> bytearray(b"Hello")

---

🧠 Merksatz[Bearbeiten | Quelltext bearbeiten]

bytes = konstant (wie ein schreibgeschützter String aus Bytes)
bytearray = veränderlich (wie eine „Byte-Liste“)

---

⚙️ Beispiel: UART mit MicroPython[Bearbeiten | Quelltext bearbeiten]

import machine

uart = machine.UART(1, baudrate=9600)

# Empfang in veränderlichem Buffer
buf = bytearray(32)
n = uart.readinto(buf)           # liest direkt in den Buffer (schnell!)
print(buf[:n])

# Senden
uart.write(b"OK\r\n")            # feste Daten -> bytes

---

🔍 Vergleichstabelle[Bearbeiten | Quelltext bearbeiten]

Merkmal bytes bytearray
Veränderbarkeit ❌ unveränderlich ✅ veränderlich
Typische Verwendung feste Binärdaten, Protokollkonstanten Puffer für UART, SPI, I²C, Netzwerk
Speicherbedarf etwas kleiner etwas größer (wegen Änderbarkeit)
Erzeugung b"Hello" oder bytes([72, 101]) bytearray(b"Hello") oder bytearray(32)
Index-Zugriff nur lesend lesend und schreibend
Änderung einzelner Bytes ❌ nicht erlaubt ✅ erlaubt (ba[0] = 65)
Schreiben in Puffer (I/O) meist nicht erlaubt bevorzugt (uart.readinto(buf))
Konvertierbar zu bytearray(b) → bytearray bytes(ba) → bytes
Speicherfreigabe nicht wiederverwendbar wiederverwendbarer Speicherpuffer
Performance bei vielen Änderungen ineffizient effizient (In-Place-Änderung)

---

⚙️ Praxisempfehlung[Bearbeiten | Quelltext bearbeiten]

Situation Empfohlener Typ
feste Kommandos (z. B. b"AT\r\n") bytes
Empfangsdaten von UART/SPI/I²C bytearray
Verarbeitung von Binärdaten ohne Änderung bytes
Wiederverwendbarer Speicherpuffer (z. B. SD-Block) bytearray
Manipulation einzelner Bytes bytearray

---

Zusammenfassung[Bearbeiten | Quelltext bearbeiten]

  • bytes = unveränderlich, kompakt, ideal für feste Daten.
  • bytearray = veränderlich, ideal für Kommunikation und Speicherpuffer.

Beide Typen sind binär kompatibel und können leicht ineinander umgewandelt werden.