加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Encoding.UTF8.GetString和Encoding.UTF8.GetBytes彼此不

发布时间:2020-12-15 18:18:00 所属栏目:百科 来源:网络整理
导读:可能我错过了一些东西,但我不明白为什么Encoding.UTF8.GetString和Encoding.UTF8.GetBytes不能互相转换? 在以下示例中,myOriginalBytes和asBytes不相等,即使它们的长度不同.谁能解释我错过了什么? byte[] myOriginalBytes = GetRandomByteArray();var asSt
可能我错过了一些东西,但我不明白为什么Encoding.UTF8.GetString和Encoding.UTF8.GetBytes不能互相转换?

在以下示例中,myOriginalBytes和asBytes不相等,即使它们的长度不同.谁能解释我错过了什么?

byte[] myOriginalBytes = GetRandomByteArray();
var asString = Encoding.UTF8.GetString(myOriginalBytes);
var asBytes = Encoding.UTF8.GetBytes(asString);

解决方法

如果你从一个有效的UTF-8字节序列开始,它们就会反转,但如果你只是从一个任意字节序列开始它们就不会.

让我们来看一个具体而简单的例子:单个字节0xff.这不是任何文本的有效UTF-8编码.所以如果你有:

byte[] bytes = { 0xff };
string text = Encoding.UTF8.GetString(bytes);

…你最终将文本作为单个字符,U+FFFD,“Unicode替换字符”,用于表示解码二进制数据时出错.对于任何无效序列,您最终会得到替换字符 – 例如,如果以0x80开头,则会获得相同的文本.显然,如果多个二进制输入被解码为相同的文本输出,则它不可能是完全可逆的变换.

如果您有任意二进制数据,则不应使用Encoding从中获取文本 – 您应该使用Convert.ToBase64String或者hex.编码用于自然文本的数据.

如果你走向相反的方向,像这样:

string text = GetRandomText();
byte[] bytes = Encoding.UTF8.GetBytes(text);
string text2 = Encoding.UTF8.GetString(bytes);

…我希望text2等于文本,除了你有无效文本的奇怪情况,例如与“一半”代理对.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读