【C#】byte[]配列の値が127より大きい場合とstringとの相互変換
2074 ワード
byte[]配列に触れるのはオブジェクトをシーケンス化するときで、byte[]配列をstringに変換するときに、いろいろな方法を試したことがあります.
string s1 = System.Text.Encoding.ASCII.GetString(b); string s2 = System.Text.Encoding.Default.GetString(b);
byte[] b1 = System.Text.Encoding.ASCII.GetBytes(s1); byte[] b2 = System.Text.Encoding.Default.GetBytes(s2);
デフォルトの符号化方式やASCII符号の符号化方式、UnicodeやUTF-8などは試しなくてもいいので、後で例をあげます.
あなたのbyte[]配列に127より大きいものがある場合、上記の2つの方法も使いにくいかもしれませんが、127より大きい値は「?」に変換されます.byteに変換すると「?」のASCIIコード値63(この文章を書いた時に再度上のコードをテストして、意外にもデフォルトの方式が間違いがないことを発見して、少し汗をかいています=!、後で1種の私の自分で書く方法を話します).まず、私が書いた解決方法を含むテストコードを貼ります.
テスト結果:
b1 = 63 ,63,63,63,111
b2 = 255, 128, 254, 233, 111
b3 = 255, 128, 254, 233, 253,255
b4 = 239,191,189,239,191,189,239,191,189,239,191,189,111
b5 = 255, 128, 254, 233, 111
string s1 = System.Text.Encoding.ASCII.GetString(b); string s2 = System.Text.Encoding.Default.GetString(b);
byte[] b1 = System.Text.Encoding.ASCII.GetBytes(s1); byte[] b2 = System.Text.Encoding.Default.GetBytes(s2);
デフォルトの符号化方式やASCII符号の符号化方式、UnicodeやUTF-8などは試しなくてもいいので、後で例をあげます.
あなたのbyte[]配列に127より大きいものがある場合、上記の2つの方法も使いにくいかもしれませんが、127より大きい値は「?」に変換されます.byteに変換すると「?」のASCIIコード値63(この文章を書いた時に再度上のコードをテストして、意外にもデフォルトの方式が間違いがないことを発見して、少し汗をかいています=!、後で1種の私の自分で書く方法を話します).まず、私が書いた解決方法を含むテストコードを貼ります.
static void Main(string[] args)
{
byte[] b = { 255, 128,254,233,111 };
string s1 = System.Text.Encoding.ASCII.GetString(b);
string s2 = System.Text.Encoding.Default.GetString(b);
string s3 = System.Text.Encoding.Unicode.GetString(b);
string s4 = System.Text.Encoding.UTF8.GetString(b);
byte[] b1 = System.Text.Encoding.ASCII.GetBytes(s1);
byte[] b2 = System.Text.Encoding.Default.GetBytes(s2);
byte[] b3 = System.Text.Encoding.Unicode.GetBytes(s3);
byte[] b4 = System.Text.Encoding.UTF8.GetBytes(s4);
string s5 = getString(b);
byte[] b5 = getBytes(s5);
bool bo1 = s2.Equals(s5);
bool bo2 = s2.Equals(System.Text.Encoding.Default.GetString(b2));
bool bo3 = s3.Equals(System.Text.Encoding.Unicode.GetString(b3));
}
static byte[] getBytes(string s) //string byte[]
{
byte[] b = new byte[s.Length];
for (int i = 0; i < s.Length; i++)
{
b[i] = Convert.ToByte(s[i]);
}
return b;
}
static string getString(byte[] b) // byte[] string
{
string s = "";
for (int i = 0; i < b.Length; i++)
s += ((char)b[i]).ToString();
return s;
}
の実装は簡単ですが、byte[]配列の各要素をStringに変換して接続し、stringの各文字をbyteに変換する試みにすぎません.テスト結果:
b1 = 63 ,63,63,63,111
b2 = 255, 128, 254, 233, 111
b3 = 255, 128, 254, 233, 253,255
b4 = 239,191,189,239,191,189,239,191,189,239,191,189,111
b5 = 255, 128, 254, 233, 111