String s1= System.Text.Encoding.UTF8.GetString(new byte[] {21,21,199,94,233,144,217,27 });
//s1="^"
byte[] bytes=System.Text.Encoding.UTF8.GetBytes(s1);
//bytes={21,21,94,27};
String S2=System.Text.Encoding.UTF8.GetString(bytes);
//S2="^"将一个字节数组转换为字符串,同时将转换过来的字符串转换回字节数组时怎么出现为不同的byte[],
而将此byte[]转换为字符串,还是原来那字符串(即S2=S1,而new byte[]!=bytes,怎样才能得到将字符串转换为原来的字节数组。
//s1="^"
byte[] bytes=System.Text.Encoding.UTF8.GetBytes(s1);
//bytes={21,21,94,27};
String S2=System.Text.Encoding.UTF8.GetString(bytes);
//S2="^"将一个字节数组转换为字符串,同时将转换过来的字符串转换回字节数组时怎么出现为不同的byte[],
而将此byte[]转换为字符串,还是原来那字符串(即S2=S1,而new byte[]!=bytes,怎样才能得到将字符串转换为原来的字节数组。
Convert.ToBase64String();
Convert.FromBase64String();
string aaa = bytesOld.ToString();
String s1 = System.Text.Encoding.ASCII.GetString(bytesOld);
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s1);
String S2 = System.Text.Encoding.UTF8.GetString(bytes);改成ASCII byte[]内容一样
你给的byte根本不能被正确编码,编码时候被省略了。所以你再编码回去就不对;
你用一个正确的字符串数组才行;
byte[] bytes = System.Text.Encoding.UTF8.GetBytes("abcd");
你的第一个字节数组在转换为字符串的时候,因为,不是合法的Utf-8,所以基本都被过滤了,只剩下,合法的字符串,所以,你再转回去的时候,就少了那些不合法的字节,所以才会不一样,
如果你想不被过滤的话,要么考虑用扩展的ASCII码来转换成字符串,就OK了,或者用其它的算法,如 Base64[code=MSIL]UTF-8编码规则是这样的如果一个字符串是三个字节的编码,那这个字符就应该是以下的BIT位 表示法
就是这样:0XXXXXXX 10XXXXXX 110XXXXX如果是双字节的编码则是0XXXXXXX 10XXXXXX当如果出现这样
0XXXXXXX 110XXXXX
或是
0XXXXXXX 10XXXXXX 11110XXX
或是
0XXXXXXX 110XXXXX 10XXXXXX
这样他都是不合法的字符串在UTF-8中都是以 0XXXXXXX 这样的字节做为一个字符的开始[/code]
建议,不要指定编码.写Encoding.Default.默认方式吧
现在发现,每次发贴,都会出现点错误,上面的贴有错误,我自己更正一下UTF-8编码规则是这样的如果一个字符串是三个字节的编码,那这个字符就应该是以下的BIT位 表示法
就是这样:1110XXXX 10XXXXXX 10XXXXXX如果是双字节的编码则是110XXXXX 10XXXXXX单字节字符就是这样的
0XXXXXXX当如果出现这样
110XXXXX 0XXXXXXX
或是
0XXXXXXX 10XXXXXX
或是
110XXXXX 110XXXXX
这样他都是不合法的字符串字符的起始字符是
1110XXXX 表示这个字符是由三个字节组成,这是第一个字节
111110XX 表示这个字符是由五个字节组成,这是第一个字节
0XXXXXXX 表示这个字符是由1个字节组成10XXXXXX 表示这个字节只是一个字符的组成字节,他不能做为字符的第一个字节