.NET(C#)で、手動で特定のエンコーディングを指定せずに、string
をbyte[]
に変換するにはどうすればよいですか?
文字列を暗号化しようと思っています。変換せずに暗号化することはできますが、それでもなぜここでエンコーディングが関係してくるのかを知りたいのです。
また、なぜエンコーディングが考慮されなければならないのでしょうか?単純に文字列が何バイトで格納されているかを取得することはできないのでしょうか?なぜ、文字エンコーディングに依存するのでしょうか?
文字列のエンコーディング(ASCII、UTF-8、...)に依存します。
例えば、以下のようになります。
byte[] b1 = System.Text.Encoding.UTF8.GetBytes (myString);
byte[] b2 = System.Text.Encoding.ASCII.GetBytes (myString);
なぜエンコーディングが重要なのか、その小さなサンプルです。
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では特殊文字を扱うことができません。
内部的には、.NETフレームワークは文字列を表現するためにUTF-16を使用しているので、単に.NETが使用する正確なバイトを取得したい場合は、System.Text.Encoding.Unicode.GetBytes (...)
を使用してください。
詳細は、Character Encoding in the .NET Framework (MSDN)を参照してください。
// 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);