Bytearray und Bytestring
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.