从字节数组转换为字符串时出现奇怪的结果
本文关键字:结果 字符串 字节数 字节 数组 转换 | 更新日期: 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 超出了该范围,因此当转换为字符串时,它会转换为 "?",用于无法表示的字符。