Base64: 空间使用量增长的最坏情况是什么?

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

108595 次浏览

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

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

ceil(n / 3) * 4

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

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

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

维基百科

注意,给定一个n字节的输入, 输出将是(n + 2 - (n + 2) % 3)) / 3 * 4字节长,使 每个输入字节的输出字节数 收敛于4 / 3或1.33333 大n。< / p >

所以16kb * 4 / 3只提供了21.3' kb,确切地说是21848字节。

希望这能有所帮助

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

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

这是我将来的参考。由于问题是在最糟糕的情况下,我们应该考虑换行。RFC 1421定义的最大行长是64个字符,而RFC 2045 (MIME)规定一行最多有76个字符。

后者是c#库实现的。所以在Windows环境中,换行符是2个字符(\r\n),我们得到这个: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的16kbytes的答案是:22422个字符

假设在Linux中它是Length = Floor(Ceiling(N/3) * 4 * 77 / 76),但我还没有抽出时间在我的. net核心上测试它。