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

时间:2016-12-29 23:11:57

标签: c# arrays string size byte

我试图理解字节数组的大小是如何小于字符串的。我知道字符串的每个字符都是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 个答案:

答案 0 :(得分:9)

尺寸/长度匹配,但仅限于使用1:1编码。

首先,您似乎对编码是有点困惑。请记住,字节只是数字(范围为0-127),并且是计算机可存储的唯一事物。除了数值之外,这些数字不会意味着任何人类。因为我们希望能够存储 text 的想法,所以我们必须想出一种方法来将这些数字映射到可读(和一些不那么可读)的字符。这些方法称为编码

您使用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编码中的字符只有两个字节,这就是为什么您的号码不像您在问题中提到的那样加倍。