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żone 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.
// 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);