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

标签 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);

返回:

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/

相关文章:

c# - 使用 C# 在 Excel 中进行条件格式设置

c# - 如何在 AvalonEdit 中启用虚拟空间?

c# - 正则表达式查找字符串中出现的第一个大写字母

c# - 在 asp.net webforms 上创建单个异步 webmethod 以进行长轮询

arrays - 找出 m 和 n 之间的所有整数,这些整数的平方和本身就是一个平方

arrays - EditingStyle - 删除数组中的单元格和项目

c++ - 从字符串文字初始化字符数组是数组复制初始化的情况吗?

Java SHA-512 函数仅产生 508 位输出?

python - 通过在 Python 3.7 中按段落计算单词来自定义数据结构

c# - Bootstrap 3 Datepicker 和 DateTime 验证错误