Jak mogę uzyskać spójną bajtową reprezentację łańcuchów w C# bez ręcznego określania kodowania?

Jak przekonwertować string na byte[] w .NET (C#) bez ręcznego określania konkretnego kodowania?

Mam zamiar zaszyfrować ten ciąg znaków. Mogę go zaszyfrować bez konwersji, ale nadal chciałbym wiedzieć, dlaczego kodowanie wchodzi tutaj w grę.

Również, dlaczego kodowanie powinno być brane pod uwagę? Czy nie mogę po prostu uzyskać, w jakich bajtach został zapisany łańcuch? Dlaczego istnieje zależność od kodowania znaków?

Zależy to od kodowania twojego łańcucha (ASCII, UTF-8, ...).

Na przykład:

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

Mała próbka dlaczego kodowanie ma znaczenie:

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 po prostu nie jest'wyposa&#380one do radzenia sobie ze znakami specjalnymi.

Wewnętrznie, framework .NET używa UTF-16 do reprezentowania łańcuchów, więc jeśli chcesz po prostu uzyskać dokładne bajty, których używa .NET, użyj System.Text.Encoding.Unicode.GetBytes (...).

Zobacz Character Encoding in the .NET Framework (MSDN), aby uzyskać więcej informacji.

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