可能我错过了一些东西,但我不明白为什么Encoding.UTF8.GetString和Encoding.UTF8.GetBytes不能互相转换?
在以下示例中,myOriginalBytes和asBytes不相等,即使它们的长度不同.谁能解释我错过了什么?
byte[] myOriginalBytes = GetRandomByteArray();
var asString = Encoding.UTF8.GetString(myOriginalBytes);
var asBytes = Encoding.UTF8.GetBytes(asString);
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 16
如果你从一个有效的UTF-8字节序列开始,它们就会反转,但如果你只是从一个任意字节序列开始它们就不会.
让我们来看一个具体而简单的例子:单个字节0xff.这不是任何文本的有效UTF-8编码.所以如果你有:
byte[] bytes = { 0xff };
string text = Encoding.UTF8.GetString(bytes);
Run Code Online (Sandbox Code Playgroud)
...你最终将text成为一个单字符,U + FFFD,"Unicode替换字符",用于表示解码二进制数据时出错.对于任何无效序列,您最终会得到替换字符- 例如,如果以0x80开头,则会获得相同的文本.显然,如果多个二进制输入被解码为相同的文本输出,则它不可能是完全可逆的变换.
如果你有任意的二进制数据,你应该不使用Encoding从中获取文本-你应该使用Convert.ToBase64String或也许十六进制.Encoding用于自然文本的数据.
如果你走向相反的方向,像这样:
string text = GetRandomText();
byte[] bytes = Encoding.UTF8.GetBytes(text);
string text2 = Encoding.UTF8.GetString(bytes);
Run Code Online (Sandbox Code Playgroud)
...... 除了奇怪的情况之外,我希望text2它是平等的text,你可以开始使用无效的文本,例如使用"half"代理对.
| 归档时间: |
|
| 查看次数: |
5474 次 |
| 最近记录: |