Base64:最糟糕的空间使用增加是什么?

问题描述 投票:0回答:6

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

base64 expansion
6个回答
300
投票

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

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

ceil(n / 3) * 4

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

一个rough近似值是数据的大小增加到原来的4/3。


40
投票

来自维基百科

注意给定 n 个字节的输入, 输出将是 (n + 2 - ((n + 2) % 3)) / 3 * 4 字节长,所以 每个输入字节的输出字节数 收敛到 4 / 3 或 1.33333 大号

所以 16kb * 4 / 3 给出的数据很少超过 21.3' kb,确切地说是 21848 字节。

希望这有帮助


11
投票

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


7
投票

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

实际编码的增加已经在上面描述了。


3
投票

这是我自己未来的参考。由于问题是 worst 情况,我们应该考虑换行符。 RFC 1421 将最大行长度定义为 64 个字符,而 RFC 2045 (MIME) 规定一行最多 76 个字符。

后者是C#库实现的。所以在换行符为 2 个字符的 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 核心上测试它。


0
投票

它还取决于实际的字符编码,即如果我们编码为 UTF-32 字符串,每个 base64 字符将消耗 3 个额外的字节(每个字符 4 个字节)。

© www.soinside.com 2019 - 2024. All rights reserved.