我试图理解字节数组的大小是如何小于字符串的。我知道字符串的每个字符都是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
答案 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编码中的字符只有两个字节,这就是为什么您的号码不像您在问题中提到的那样加倍。