Base64:空间使用量增幅最大的是什么?

时间:2011-01-17 16:27:46

标签: base64 expansion

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

5 个答案:

答案 0 :(得分:211)

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

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

ceil(n / 3) * 4

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

粗略近似值是数据的大小增加到原始值的4/3。

答案 1 :(得分:32)

来自Wikipedia

  

注意,给定n个字节的输入,   输出为(n + 2 - ((n + 2)%   3))/ 3 * 4字节长,这样   每个输入字节的输出字节数   收敛到4/3或1.33333   大n。

因此,16kb * 4/3的确超过21.3'kb或21848字节。

希望这有帮助

答案 2 :(得分:10)

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:0)

这对我自己是将来的参考。由于问题是关于最坏的情况,因此我们应该考虑换行符。尽管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 KB的答案:22422个字符

假设在Linux中是Length = Floor(Ceiling(N/3) * 4 * 77 / 76),但是我还没有在.NET内核上进行测试。