Come posso ottenere una rappresentazione coerente in byte delle stringhe in C# senza specificare manualmente una codifica?

Come posso convertire una stringa in un byte[] in .NET (C#) senza specificare manualmente una codifica specifica?

Ho intenzione di criptare la stringa. Posso crittografarla senza convertirla, ma vorrei comunque sapere perché la codifica entra in gioco qui.

Inoltre, perché la codifica dovrebbe essere presa in considerazione? Non posso semplicemente ottenere in quali byte è stata memorizzata la stringa? Perché c'è una dipendenza dalle codifiche dei caratteri?

Dipende dalla codifica della vostra stringa (ASCII, UTF-8, ...).

Per esempio:

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

Un piccolo esempio del perché la codifica è importante:

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 semplicemente non è attrezzato per trattare i caratteri speciali.

Internamente, il framework .NET usa UTF-16 per rappresentare le stringhe, quindi se volete semplicemente ottenere i byte esatti che .NET usa, usate System.Text.Encoding.Unicode.GetBytes (...).

Vedi Character Encoding in the .NET Framework (MSDN) per maggiori informazioni.

Commentari (9)
byte[] strToByteArray(string str)
{
    System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    return enc.GetBytes(str);
}
Commentari (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);
Commentari (1)