C# 从字节数组转换为字符串时出现奇怪的结果

C# 从字节数组转换为字符串时出现奇怪的结果,c#,character-encoding,ascii,C#,Character Encoding,Ascii,当将字节数组转换为字符串,然后将字符串转换回字节数组时,我得到了奇怪的结果 试试这个: byte[] b = new byte[1]; b[0] = 172; string s = Encoding.ASCII.GetString(b); byte[] b2 = Encoding.ASCII.GetBytes(s); MessageBox.Show(b2[0].ToString()); 对我来说,结果并不像我预期的那样是172,但是。。。63 为什么

当将字节数组转换为字符串,然后将字符串转换回字节数组时,我得到了奇怪的结果

试试这个:

     byte[] b = new byte[1];
    b[0] = 172;
    string s = Encoding.ASCII.GetString(b);

    byte[] b2 = Encoding.ASCII.GetBytes(s);
    MessageBox.Show(b2[0].ToString());
对我来说,结果并不像我预期的那样是172,但是。。。63

为什么会这样

为什么会这样

因为ASCII最多只包含127个值

当面对对给定编码无效的二进制数据时,
encoding.GetString
可以提供替换字符,或引发异常。在这里,它使用了替换字符

目前还不清楚您到底想要实现什么,但是:

  • 如果要将任意二进制数据转换为文本,请使用;不要尝试使用编码,因为您并不是真正地表示文本。您可以使用来解码
  • 编码。ASCII
    通常是一个不好的选择,而且包含172字节的二进制数据肯定不是ASCII文本
  • 您需要确定实际使用的编码。就我个人而言,我不喜欢使用
    编码。默认值
    ,除非您确实知道数据是您正在使用的平台的默认编码。如果你有选择的话,使用UTF-8是个不错的选择
为什么会这样

因为ASCII最多只包含127个值

当面对对给定编码无效的二进制数据时,
encoding.GetString
可以提供替换字符,或引发异常。在这里,它使用了替换字符

目前还不清楚您到底想要实现什么,但是:

  • 如果要将任意二进制数据转换为文本,请使用;不要尝试使用编码,因为您并不是真正地表示文本。您可以使用来解码
  • 编码。ASCII
    通常是一个不好的选择,而且包含172字节的二进制数据肯定不是ASCII文本
  • 您需要确定实际使用的编码。就我个人而言,我不喜欢使用
    编码。默认值
    ,除非您确实知道数据是您正在使用的平台的默认编码。如果你有选择的话,使用UTF-8是个不错的选择

ASCII编码是一种7位编码。如果查看生成的字符串,它包含“?”—无法识别的字符。您可以选择编码。默认值。

ASCII编码是7位编码。如果查看生成的字符串,它包含“?”—无法识别的字符。您可以选择编码。默认值。

ASCII是七位字符编码,因此172不在该范围内,因此在转换为字符串时,它会转换为“?”,用于无法表示的字符。

ASCII是七位字符编码,因此172不在该范围内,因此在转换为字符串时,它转换为“?”,用于无法表示的字符。

172不是定义的ASCII字符。你得到的是
?(63)
很明显,你的例子是人为的。您试图解决的真正问题是什么?172不是定义的ASCII字符。你得到的是
?(63)
很明显,你的例子是人为的。你试图解决的真正问题是什么?如果OP试图对任意二进制数据进行编码,然后再次解码,那么他根本不应该使用编码。建议编码。默认是个坏主意,我同意。另外,使用字符串来包含二进制数据是一个坏主意。那么,试图这样编码它是一个坏主意。使用base64效率很低,但是如果您只有一个文本形状的管道,并且希望传输二进制数据,那么至少可以安全地将其传输到那里……如果OP尝试对任意二进制数据进行编码,然后再次解码,那么他根本不应该使用编码。建议编码。默认是个坏主意,我同意。另外,使用字符串来包含二进制数据是一个坏主意。那么,试图这样编码它是一个坏主意。使用base64效率低下,但如果您只有一个文本形状的管道,并且希望传输二进制数据,那么至少可以安全地将其传输到那里。。。