【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種の私の自分で書く方法を話します).まず、私が書いた解決方法を含むテストコードを貼ります.
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