我试图了解字节大小的数组为何小于字符串。我知道字符串的每个字符都像 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);
返回:
Size of byte array: 5
Size of string: 8
最佳答案
尺寸/长度匹配,但前提是您使用 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);
你得到了预期的结果:
Size of byte array: 5
Size of string: 5
使用 Base64(即使有开销)的原因是它可以将 任何 字节数组编码为可打印字符(这在尝试通过 URL 发送它们时是必需的),而 ASCII 编码将导致相当多的值出现无法打印的字符。
另请注意,一个字符在 UTF-16 编码中只有两个字节,这就是为什么您的数字不像您在问题中提到的那样加倍。
关于c# - 为什么字节数组的大小不等于字符串的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388493/