接触到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);
缺省的编码方式以及ASCⅡ码的编码方式,Unicode和UTF-8之类的就不用尝试了,后面会给例子。
在你的byte[]数组中有大于127的时候,可能上面两种方法也不好使了,大于127的值通通转化成‘?’,再转换成byte就是‘?’的ASCⅡ码值63(在写这篇文章的时候再次测试了上面的代码,意外发现了缺省的方式没有出错,有点汗颜= =!!,后面会讲一种我自己写的方法)。先贴一段测试代码,包含我写的解决方法。
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