191

如果服务器收到 base64 字符串并想在转换之前检查它的长度,假设它希望始终允许最终字节数组为 16KB。当转换为 Base64 字符串(假设每个字符一个字节)时,16KB 字节数组可能会变得多大?

4

5 回答 5

279

Base64 将每组三个字节编码为四个字节。此外,输出被填充为始终为四的倍数。

这意味着大小为 n 的字符串的 base-64 表示的大小为:

ceil(n / 3) * 4

因此,对于 16kB 数组,base-64 表示将是 ceil(16*1024/3)*4 = 21848 字节长 ~= 21.8kB。

粗略的估计是数据的大小增加到原来的 4/3。

于 2011-01-17T16:34:30.060 回答
39

来自维基百科

请注意,给定 n 字节的输入,输出将是 (n + 2 - ((n + 2) % 3)) / 3 * 4 字节长,因此每个输入字节的输出字节数收敛到 4 / 3或 1.33333 表示大 n。

因此,确切地说,16kb * 4 / 3 仅提供 21.3' kb 或 21848 字节。

希望这可以帮助

于 2011-01-17T16:35:55.770 回答
11

16kb 是 131,072 位。Base64 将 24 位缓冲区打包成四个 6 位字符,因此您将有 5,462 * 4 = 21,848 字节。

于 2011-01-17T16:34:46.877 回答
6

由于问题是关于最坏的可能增加,我必须补充一点,通常每 80 个字符左右就有换行符。这意味着如果您在 Windows 上将 base64 编码数据保存到文本文件中,它将添加 2 个字节,在 Linux 上每行 1 个字节。

上面已经描述了相对于实际编码的增加。

于 2016-04-13T05:53:24.307 回答
2

这是我未来的参考。由于问题是在最坏的情况下,我们应该考虑换行符。虽然 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 核心上测试它。

于 2019-09-02T11:28:08.207 回答