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

本文关键字:结果 字符串 字节数 字节 数组 转换 | 更新日期: 2023-09-27 18:36:01

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

试试这个:

     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可以提供替换字符或引发异常。在这里,它使用了替换字符 ? .

目前尚不清楚您要实现的目标,但是:

  • 如果要将任意二进制数据转换为文本,请改用Convert.ToBase64String;不要尝试使用编码,因为实际上并不是在表示文本。您可以使用Convert.FromBase64String进行解码。
  • Encoding.ASCII通常是一个糟糕的选择,当然包括 172 字节的二进制数据不是 ASCII 文本
  • 您需要弄清楚您实际使用的编码。就我个人而言,我不喜欢使用Encoding.Default,除非您真的知道数据是您正在使用的平台的默认编码。如果可以选择,使用 UTF-8 是一个不错的选择。

ASCII编码是7位编码。如果您查看生成的字符串,它包含"?" - 无法识别的字符。您可以改用 Encoding.Default。

ASCII 是一种七位字符编码,因此 172 超出了该范围,因此当转换为字符串时,它会转换为 "?",用于无法表示的字符。