C# 字符串到字节转换的编码问题

C# 字符串到字节转换的编码问题,c#,character-encoding,C#,Character Encoding,我正在尝试将字符串转换为字节,反之亦然..我在这个网站上看到了将字符串转换为字节数组的前一个问题..但我的问题是其他的 这是我的密码 byte[] btest = new byte[2]; btest[0] = 0xFF; btest[1] = 0xAA; UTF8Encoding enc = new UTF8Encoding(); string str = enc.GetString(btest); //here i get a string with values str = '��' /

我正在尝试将字符串转换为字节,反之亦然..我在这个网站上看到了将字符串转换为字节数组的前一个问题..但我的问题是其他的

这是我的密码

byte[] btest = new byte[2];
btest[0] = 0xFF;
btest[1] = 0xAA;
UTF8Encoding enc = new UTF8Encoding();
string str = enc.GetString(btest); //here i get a string with values str = '��'

//I had a byte array of size 2 with the above contents
//Here i am trying to convert the string to byte array
byte [] bst = enc.GetBytes(str); //On this step i get a byte array of size 6 
//and bst array contents as {239,191,189,239,191,189}

//In this step i try to convert the value back to btest array by taking the index
btest[0] = Convert.ToByte(str[0]); //on this line i get an exception
//Exception : Value was either too large or too small for an unsigned byte.
btest[1] = Convert.ToByte(str[1]);
GetBytes不应该返回一个大小为2的字节数组吗,我做错了什么?? 我希望bst[0]包含我分配给btest[0]的相同值


谢谢

带有代码点的字符
0xFF 0xAA
在UTF-8编码中无效,因此它被转换为

参考资料:

  • 请参见相应wikipedia页面上的有效代码点范围:

原始字节输入无效UTF-8(请参阅),因为它不表示任何unicode码点。结果,无效数据被转换为�. 最后,这是一个类似于其他任何字符的字符,因此如果您尝试将其转换回字节,它不会生成初始错误的字节序列,而是生成表示该unicode代码点的正确字节序列(两次)

字符不能表示为单个字节,因此
Convert.ToByte
抛出
溢出异常

如果要将原始输入更改为有效的字节序列,请说:

btest[0] = 0xDF;
btest[1] = 0xBF;

您将看到,
enc.GetBytes(str)
调用实际上会再次生成一个双字节数组。

请尽量在问题标题中更加清楚。:)但是当我把它转换回来的时候,为什么我得不到正确的输出呢?@singh:这是正确的。
str
等于
��每一个都用3字节的代码点表示,实际上我把从这里构造的字符串传递给C++,但是我没有得到正确的值,正如David Heffernan在他的回答中所解释的那样,如果我用Kunal'回答同一个问题,我得到正确的答案。value@singh:你得到了两个解释这种行为的答案。如果执行
1+1
,返回的值将是
2
,而不是
5
,即使您确实需要它。