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


166

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

Answers:


242

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

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

ceil(n / 3) * 4

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

一个粗略的近似值将是该数据的尺寸增大到原来的4/3。


我们是否需要将长度加2?
vIceBerg,2015年

@vIceBerg,这取决于您是否使用ceilfloat数字或只是int数字。(和否ceil
布赖恩·菲尔德

7
我猜想更简单的方法是添加原始大小的1/3。
mvmn

1
在您提出的示例中,以相同的度量顺序显示结果将提高答案的质量(21.3 KB而不是21848字节)。
伊万·德·帕兹·森特诺

36

来自维基百科

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

因此,确切地说,16kb * 4/3几乎不超过21.3'kb,即21848字节。

希望这可以帮助


11

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


5

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

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


3
1个源字节变成4个base64字节,所以增加4倍,这不是极端情况吗?正如其他人所说的那样,任何更长的源材料都会获得更好的比率,直到渐近地接近1.333 ...
Olie

1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.