Umwandlung eines Strings in ein Byte-Array in C#: Vollständige Anleitung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

„Strings“ und „Bytes“: Warum ist das der ewige Schmerzpunkt eines Programmierers?

\n

Stellen Sie sich folgende Situation vor: Sie schreiben in C# eine Netzwerkanwendung, senden Daten an den Server, und am Ende erhalten Sie ein Durcheinander von Zeichen. Oder Sie verschlüsseln ein Passwort, und am anderen Ende kann es nicht entschlüsselt werden. Kommt Ihnen das bekannt vor? Die Ursache des Übels liegt oft in der falschen Umwandlung eines Strings in ein Byte-Array (und umgekehrt).

\n

Die Frage „Converting string to byte array in C#“ auf Stack Overflow hat nicht umsonst tausende Aufrufe gesammelt. Dies ist die Grundlage, auf der die Arbeit mit Dateien, Kryptographie, Serialisierung und Netzwerkkommunikation beruht. Ohne Verständnis dieses Themas werden Sie immer wieder auf die gleichen Probleme stoßen. Lassen Sie uns ein für alle Mal klären, wie man es richtig macht.

\n\n

Warum kann man nicht einfach einen String in Bytes umwandeln?

\n

Ein naiver Ansatz wäre die Verwendung von BitConverter.GetBytes() für ein Zeichen? Nein. Das Problem ist, dass ein String eine Abstraktion ist, die aus Zeichen (char, 2 Bytes in C#) besteht. Ein Byte-Array hingegen sind rohe Daten, die von der Kodierung abhängen.

\n

Das gleiche Zeichen „A“ belegt in der Kodierung UTF-8 1 Byte, in UTF-16 2 Bytes und in UTF-32 4 Bytes. Wenn Sie die falsche Kodierung wählen, gehen Daten verloren. Merken Sie sich die Hauptregel: Geben Sie die Kodierung immer explizit an.

\n\n

Die beliebteste Methode: Encoding.UTF8.GetBytes()

\n

Das werden Sie in 90% der Fälle verwenden. UTF-8 ist der De-facto-Standard für das Web, JSON und die meisten APIs.

\n\n
using System;\nusing System.Text;\n\nclass Program\n{\n    static void Main()\n    {\n        string original = "Привет, мир! 🌍";\n        \n        // Wandelt den String in ein Byte-Array um (UTF-8)\n        byte[] utf8Bytes = Encoding.UTF8.GetBytes(original);\n        \n        // Rückumwandlung (zur Überprüfung)\n        string restored = Encoding.UTF8.GetString(utf8Bytes);\n        \n        Console.WriteLine($"Ursprünglicher String: {original}");\n        Console.WriteLine($"Byte-Array (Länge {utf8Bytes.Length}): {BitConverter.ToString(utf8Bytes)}");\n        Console.WriteLine($"Wiederhergestellter String: {restored}");\n    }\n}
\n\n

Ergebnis der Ausführung:

\n
Ursprünglicher String: Привет, мир! 🌍\nByte-Array (Länge 18): D0-9F-D1-80-D0-B8-D0-B2-D0-B5-D1-82-2C-20-D0-BC-D0-B8-D1-80-21-20-F0-9F-8C-8D\nWiederhergestellter String: Привет, мир! 🌍
\n\n

Beachten Sie: Das Emoji „🌍“ belegt 4 Bytes (F0-9F-8C-8D). UTF-8 kann mit allen Unicode-Zeichen umgehen, im Gegensatz zu veralteten Kodierungen.

\n\n

Andere gängige Kodierungen

\n
    \n
  • Encoding.ASCII — nur 7-Bit-Zeichen (0-127). Für Kyrillisch oder Sonderzeichen ungeeignet – alles über 127 wird zu '?'
  • \n
  • Encoding.Unicode (auch UTF-16LE) — wird intern in C# zur Speicherung von Strings verwendet. Jedes Zeichen belegt 2 Bytes (oder 4 für Ersatzpaare).
  • \n
  • Encoding.UTF32 — jedes Zeichen streng 4 Bytes. Ressourcenintensiv, aber vorhersagbar.
  • \n
  • Encoding.Default — Systemkodierung (ANSI). Vermeiden Sie diese! Sie ist auf verschiedenen Computern unterschiedlich.
  • \n
\n\n

Umwandlung mit BitConverter und MemoryStream

\n

Manchmal benötigt man die „rohe“ Darstellung eines Strings als Zeichen-Array (char). Dies ist nicht dasselbe wie Bytes in einer Kodierung, kann aber für Low-Level-Arbeiten nützlich sein.

\n\n
string text = "C#";\n// Erhalten des char-Arrays\nchar[] chars = text.ToCharArray();\n// Konvertieren jedes char in 2 Bytes (Little-Endian)\nbyte[] rawBytes = new byte[chars.Length * sizeof(char)];\nBuffer.BlockCopy(chars, 0, rawBytes, 0, rawBytes.Length);\n\nConsole.WriteLine(BitConverter.ToString(rawBytes)); // 43-00-23-00
\n\n

Diese Methode liefert ein Array in der Kodierung UTF-16LE (wie es im Speicher abgelegt wird). Verwenden Sie sie nur, wenn Sie genau wissen, was Sie tun.

\n\n

Spezialfall: Base64

\n

Es

Blogs

Buchempfehlungen