可能我遗漏了什么,但我不明白为什么 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);
...你最终会得到 text
是一个字符,U+FFFD ,“Unicode 替换字符”,用于指示解码二进制数据时出现错误。您最终会得到 任何 无效序列的替换字符 - 因此,如果您以 0x80 开头,您将得到相同的文本。显然,如果多个二进制输入被解码为相同的文本输出,则它不可能是完全可逆的转换。
如果您有任意二进制数据,您应该不使用Encoding
从中获取文本 - 您应该使用Convert.ToBase64String
或者也许十六进制。 编码
用于自然文本的数据。
如果你朝相反的方向走,像这样:
string text = GetRandomText();
byte[] bytes = Encoding.UTF8.GetBytes(text);
string text2 = Encoding.UTF8.GetString(bytes);
...我希望 text2
等于 text
除了你有无效 text 的奇怪情况开始,例如有“一半”的代理对。
关于c# - Encoding.UTF8.GetString 和 Encoding.UTF8.GetBytes 不是彼此相反的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45410219/