Wie konvertiert man eine Zeichenfolge in ein Byte-Array in .NET?

72

Ich habe eine Zeichenfolge, die ich in das entsprechende Array von Bytes in .NET konvertieren muss.

Das sollte einfach sein, aber ich habe einen Gehirnkrampf.

JonStonecash
quelle

Antworten:

98

Sie müssen eine encoding ( System.Text.Encoding) verwenden, um .NET mitzuteilen, was Sie als Ausgabe erwarten. Zum Beispiel in UTF-16 (= System.Text.Encoding.Unicode) :

var result = System.Text.Encoding.Unicode.GetBytes(text);
Konrad Rudolph
quelle
4
In System.Text.Encoding gibt es viel mehr Codierungen als nur Unicode: Stellen Sie sicher, dass Sie verstehen, welche Sie benötigen.
Joel Coehoorn
1
Joel: Daher habe ich "zum Beispiel" geschrieben. ;-) Aber dein Kommentar ist natürlich gültig.
Konrad Rudolph
:) Ich versuche zu zeigen, wo sich die Nicht-UTF16-Codierungen befinden - ich hätte es wahrscheinlich besser formulieren können.
Joel Coehoorn
Kannst du bitte meine Frage dazu sehen?
Moeez
41

Ermitteln Sie zunächst, welche Codierung Sie möchten: Sie müssen zuerst etwas über Unicode wissen .

Als nächstes herausfinden, was System.Text.Encodingdas entspricht. Meine Core .NET-Refcard beschreibt die meisten gängigen und wie eine Instanz abgerufen wird (z. B. durch eine statische Eigenschaft von Encodingoder durch Aufrufen von a Encoding.GetEncoding.

Stellen Sie abschließend fest, ob Sie alle Bytes auf einmal möchten (was die einfachste Arbeitsweise ist - rufen Sie Encoding.GetBytes (Zeichenfolge) einmal auf und Sie sind fertig) oder ob Sie es in Blöcke aufteilen müssen - in diesem Fall ' Ich möchte Encoding.GetEncoder verwenden und dann jeweils ein Bit codieren. Der Encoder sorgt dafür, dass der Status zwischen den Aufrufen erhalten bleibt, falls Sie beispielsweise die Hälfte eines Zeichens abbrechen müssen.

Jon Skeet
quelle
9
@Mehrdad: Das tust du absolut . Eine Codierung definiert, was die Konvertierung von einer Zeichenfolge in ein Byte-Array bewirkt. Komprimierung und Verschlüsselung sind völlig unterschiedliche Dinge. Ansonsten ist es wie wenn man sagt das Bildformat spielt keine Rolle , wenn Sie ein Bild als Datei speichern möchten - viele verschiedene Bildformate sein kann , in Ordnung, aber es muss sein , eine definitions beteiligt.
Jon Skeet
8
@Mehrdad: Nein, der Benutzer muss die Codierung kennen. Nur weil UTF-16 in gewissem Sinne die natürliche Codierung für .NET ist, heißt das nicht, dass es die Codierung ist, die er verwenden möchte. Der Punkt beim Ausschreiben von Daten besteht darin, dass sie erneut gelesen werden können - und dass dieselbe Codierung verwendet werden muss. Die Tatsache, dass das OP auf "das äquivalente Array von Bytes" verweist, deutet darauf hin, dass sie nicht wissen, dass Codierungen überhaupt existieren, und es ist von entscheidender Bedeutung, Codierungen zu verstehen, wenn Sie zwischen Text- und Binärdarstellungen konvertieren möchten.
Jon Skeet
8
Ich habe gesehen, dass unzählige Menschen Informationen nicht richtig aufbewahren, weil sie Codierungen nicht verstanden haben. Nach meiner Erfahrung ist es viel besser, sie über das Thema aufzuklären, als es zu verwenden Buffer.BlockCopyund anzunehmen, dass es das ist, was sie wollen.
Jon Skeet
5
@Mehrdad: Aber jemand wird die Bytes später interpretieren. Sie haben Recht, wenn Sie sagen, dass der Komprimierungs- / Verschlüsselungsteil sich nicht darum kümmern muss, aber was auch immer später wieder in einen String umgewandelt wird, tut dies absolut ... und wenn niemand jemals die Daten interpretieren wird, gibt es nicht viel Punkt darin, dass es da ist. Ja, Sie müssen immer noch eine Codierung auswählen und sicherstellen, dass sie konsistent verwendet wird. Welche Codierung Sie verwenden möchten, ist etwas willkürlich, solange sie Ihren gesamten Text codieren kann, obwohl dies Auswirkungen auf den Speicherplatz usw. hat. Beliebig ist jedoch nicht dasselbe wie irrelevant.
Jon Skeet
6
@Mehrdad: Ja, absolut. Genauso wie Sie ein Bildformat auswählen müssen , wenn Sie ein Bild auf der Festplatte speichern möchten. Verwenden Sie diese Analogie so weit wie möglich. Strings werden nicht von Bytes gemacht (konzeptuell) so zu konvertieren , um zu Bytes, müssen Sie durch eine Art Umwandlung gehen ... und das ist genau die Codierung.
Jon Skeet
19

Welche Codierung verwenden Sie? Konrad hat es ziemlich schlecht gemacht, aber es gibt andere da draußen und Sie könnten mit dem falschen doofe Ergebnisse erzielen:

byte[] bytes = System.Text.Encoding.XXX.GetBytes(text)

Wo XXXkann sein:

ASCII
BigEndianUnicode
Default
Unicode
UTF32
UTF7
UTF8
Swilliams
quelle
8

So was:

    string test = "text";
    byte[] arr = Encoding.UTF8.GetBytes(test);
Igal Tabachnik
quelle