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

Arv*_*wen 1 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);
Run Code Online (Sandbox Code Playgroud)

返回:

字节数组的大小:5

字符串大小:8

Bra*_*NET 9

大小/长度匹配,但仅限于使用1:1编码.

首先,您似乎对编码是有点困惑.请记住,字节只是数字(范围为0-127),是计算机唯一可存储的东西.这些数字并不意味着任何东西比数值其他人.因为我们希望能够存储文本的概念,所以我们必须想出一种方法来将这些数字映射到可读(和一些不那么可读)的字符.这些方法称为编码.

您使用Base64编码对您的字节进行编码,这会产生开销(根据Base64长度计算,每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);
Run Code Online (Sandbox Code Playgroud)

你得到了预期的:

字节数组的大小:5

字符串大小:5

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

另请注意,UTF-16编码中的字符只有两个字节,这就是为什么您的数字不像您在问题中提到的那样加倍.