Wie erhalte ich eine konsistente Byte-Darstellung von Zeichenketten in C# ohne manuelle Angabe einer Codierung?

Wie konvertiere ich einen "String" in ein "Byte[]" in .NET (C#), ohne manuell eine bestimmte Kodierung anzugeben?

Ich werde die Zeichenfolge verschlüsseln. Ich kann sie verschlüsseln, ohne sie zu konvertieren, aber ich würde trotzdem gerne wissen, warum die Kodierung hier eine Rolle spielt.

Außerdem, warum sollte die Verschlüsselung berücksichtigt werden? Kann ich nicht einfach herausfinden, in welchen Bytes die Zeichenfolge gespeichert wurde? Warum gibt es eine Abhängigkeit von Zeichenkodierungen?

Dies hängt von der Kodierung Ihrer Zeichenkette ab (ASCII, UTF-8, ...).

Zum Beispiel:

byte[] b1 = System.Text.Encoding.UTF8.GetBytes (myString);
byte[] b2 = System.Text.Encoding.ASCII.GetBytes (myString);

Ein kleines Beispiel, warum Kodierung wichtig ist:

string pi = "\u03a0";
byte[] ascii = System.Text.Encoding.ASCII.GetBytes (pi);
byte[] utf8 = System.Text.Encoding.UTF8.GetBytes (pi);

Console.WriteLine (ascii.Length); //Will print 1
Console.WriteLine (utf8.Length); //Will print 2
Console.WriteLine (System.Text.Encoding.ASCII.GetString (ascii)); //Will print '?'

ASCII ist einfach nicht in der Lage, mit Sonderzeichen umzugehen.

Intern verwendet das .NET-Framework UTF-16, um Zeichenketten darzustellen. Wenn Sie also einfach nur die genauen Bytes erhalten möchten, die .NET verwendet, verwenden Sie System.Text.Encoding.Unicode.GetBytes (...).

Siehe Character Encoding in the .NET Framework (MSDN) für weitere Informationen.

Kommentare (9)
byte[] strToByteArray(string str)
{
    System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    return enc.GetBytes(str);
}
Kommentare (3)
// C# to convert a string to a byte array.
public static byte[] StrToByteArray(string str)
{
    System.Text.ASCIIEncoding  encoding=new System.Text.ASCIIEncoding();
    return encoding.GetBytes(str);
}

// C# to convert a byte array to a string.
byte [] dBytes = ...
string str;
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
str = enc.GetString(dBytes);
Kommentare (1)