【发布时间】:2011-06-10 13:37:04
【问题描述】:
如果服务器接收到 base64 字符串并想在转换之前检查它的长度,假设它希望始终允许最终字节数组为 16KB。 16KB 字节数组在转换为 Base64 字符串后可能会变成多大(假设每个字符一个字节)?
【问题讨论】:
如果服务器接收到 base64 字符串并想在转换之前检查它的长度,假设它希望始终允许最终字节数组为 16KB。 16KB 字节数组在转换为 Base64 字符串后可能会变成多大(假设每个字符一个字节)?
【问题讨论】:
Base64 将每组三个字节编码为四个字节。此外,输出被填充为始终为四的倍数。
这意味着大小为 n 的字符串的 base-64 表示的大小为:
ceil(n / 3) * 4
因此,对于 16kB 数组,base-64 表示将是 ceil(16*1024/3)*4 = 21848 字节长 ~= 21.8kB。
粗略的近似是数据的大小增加到原来的 4/3。
【讨论】:
float 数字的ceil,还是仅使用int 数字。 (没有ceil)
请注意,给定 n 个字节的输入, 输出将是 (n + 2 - ((n + 2) % 3)) / 3 * 4 字节长,这样 每个输入字节的输出字节数 收敛到 4 / 3 或 1.33333 n 大。
因此,准确地说,16kb * 4 / 3 仅提供 21.3' kb 或 21848 字节的空间。
希望对你有帮助
【讨论】:
16kb 是 131,072 位。 Base64 将 24 位缓冲区打包为每个 4 个 6 位字符,因此您将拥有 5,462 * 4 = 21,848 个字节。
【讨论】:
由于问题是关于最坏的可能增加,我必须补充一点,通常每 80 个字符左右就有换行符。这意味着如果您在 Windows 上将 base64 编码数据保存到文本文件中,它将添加 2 个字节,在 Linux 上每行 1 个字节。
上面已经描述了实际编码的增加。
【讨论】:
这是我未来的参考。由于问题是关于 worst 的情况,我们应该考虑换行符。虽然 RFC 1421 将最大行长度定义为 64 个字符,但 RFC 2045 (MIME) 声明一行最多有 76 个字符。
后者是 C# 库实现的。因此,在换行符为 2 个字符 (\r\n) 的 Windows 环境中,我们得到:Length = Floor(Ceiling(N/3) * 4 * 78 / 76)
注意:地板是因为在我使用 C# 进行测试期间,如果最后一行正好以 76 个字符结束,则不会出现换行符。
我可以通过运行以下代码来证明:
byte[] bytes = new byte[16 * 1024];
Console.WriteLine(Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks).Length);
使用 76 字符行编码为 base64 的 16 kBytes 的答案:22422 个字符
假设在 Linux 中它是 Length = Floor(Ceiling(N/3) * 4 * 77 / 76),但我还没有在我的 .NET 核心上测试它。
【讨论】: