为什么字节数组的大小不等于字符串的大小?

4

我正在尝试理解为什么字节数组的大小比字符串小。我知道字符串的每个字符大约是2个字节,但即使这样的计算也不对。请问有人能为我解释一下吗?

以下是相关内容:

byte[] myBytes = Encoding.ASCII.GetBytes("12345");
string myString = Convert.ToBase64String(myBytes);
Debug.WriteLine("Size of byte array: " + myBytes.Length);
Debug.WriteLine("Size of string: " + myString.Length);

返回:

字节数组大小:5

字符串大小:8


1
查看生成的B64字符串 - 它将是8个字符。 - Ňɏssa Pøngjǣrdenlarp
@Plutonix 正确,最终结果是 MTIzNDU=。但这就是问题所在,我期望脚本是 12345 而不是 MTIzNDU=。这就是我的困惑所在。 - Arvo Bowen
1
如果你用不同的编码方式对它进行编码,为什么它会保持不变呢?Base64 != ASCII - Ňɏssa Pøngjǣrdenlarp
1
请注意,它将完成往返 - 使用来自“MTIzNDU =”的字节,您可以获取原始数据。 - Ňɏssa Pøngjǣrdenlarp
1个回答

18

尺寸/长度是匹配的,但只有在使用1:1编码时才匹配。

首先,您似乎对编码的概念有些困惑。请记住,字节只是数字(范围为0-127),并且是计算机可存储的唯一内容。这些数字对于人类来说除了数值意义外没有其他含义。因为我们希望能够存储文本的概念,所以我们必须想出一种将这些数字映射到可读(以及一些不那么可读)字符的方法。这些方法称为编码

您使用Base64编码对字节进行编码,这会产生开销(根据Base64 length calculation?,每3个输入字节大约增加1个额外字节)。这个开销导致了您的差异。

如果您改用Encoding.ASCII

byte[] myBytes = Encoding.ASCII.GetBytes("12345");
string myString = Encoding.ASCII.GetString(myBytes);
Console.WriteLine("Size of byte array: " + myBytes.Length);
Console.WriteLine("Size of string: " + myString.Length);

你得到了预期的结果:

字节数组的大小:5

字符串的大小:5

使用Base64(即使有开销)的原因是它可以将任何字节数组编码为可打印字符(这在尝试通过URL发送它们时是必需的),而ASCII编码将导致相当多的值产生不可打印字符。

还要注意,UTF-16编码中一个字符只有两个字节,这就是你在问题中提到的数字不是双倍的原因。


感谢您对编码的解释! - Arvo Bowen
绝妙的解释! - RedKlouds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接