2013-10-18 39 views
1

将字节数组转换为字符串然后将字符串转换回字节数组时,会出现奇怪的结果。将字节数组转换为字符串时出现奇怪的结果

试试这个:

 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.

它为什么会发生?

+0

172不是定义的ASCII字符。你得到了什么? (63)' –

+1

显然你的例子是一个人为的案例。你试图解决什么是真正的问题? –

回答

5

为什么会发生?

由于ASCII仅包含值高达127

当遇到这对于给定的编码无效的二进制数据,Encoding.GetString可以提供一个替换字符,或抛出异常。在这里,它使用替代字符?

目前尚不清楚你想要达到什么,但:

  • 如果你将任意的二进制数据,文本,使用Convert.ToBase64String代替;做不是尝试使用编码,因为你并不真正代表文本。您可以使用Convert.FromBase64String进行解码。
  • 通常是一个不错的选择,当然二进制数据包括172字节是 ASCII文本
  • 你需要找出哪些编码你实际上使用。我个人不喜欢使用Encoding.Default,除非你真的知道数据是你正在工作的平台的默认编码。如果你有选择,使用UTF-8是一个不错的选择。
3

ASCII编码是一种7位编码。如果你看看生成的字符串,它包含“?” - 无法识别的字符。相反,您可以选择Encoding.Default。

+3

如果OP正在尝试对任意二进制数据进行编码,然后再次对其进行解码,他根本不应该使用编码。建议Encoding.Default是一个坏主意,海事组织。 –

+0

我同意。此外,使用字符串来包含二进制数据是一个坏主意。 –

+0

试着对它进行编码*就像那样*是一个坏主意。使用base64效率不高,但如果你只有一个文本形状的管道,并且你想传输二进制数据,那么至少可以安全地使用它。 –

1

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

相关问题