Base64:最坏的空间使用增加是多少?

210

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

6个回答

313

Base64将每个三个字节的数据编码为四个字节输出,并且输出总是被填充为四的倍数。

这意味着一个长度为n的字符串经过base-64编码后的大小为:

ceil(n / 3) * 4

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

一个粗略的估算是数据大小增加到原始大小的4/3。


我们需要将长度加2吗? - vIceBerg
@vIceBerg,这取决于您是否在使用float数字与ceil或仅使用int数字(且没有ceil)。 - 700 Software
10
我猜这个更简单的表达方式是你需要增加原始大小的1/3。 - mvmn
2
在你提出的例子中,按照相同的度量顺序显示结果会稍微提高答案的质量(21.3 KB 而不是 21848 字节)。 - Ivan De Paz Centeno
在使用单位时要小心,kB(1000 B)和KiB(1024 B)是不同的,所以ceil(16*1000/3)*4字节,详见https://en.wikipedia.org/wiki/Binary_prefix。 - undefined

42

来自维基百科

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

所以16kb * 4 / 3大约为21.8 kb,或者准确地说是21,848个字节。

希望这可以帮助您。


准确来说,它将是约21.3千字节(21,848 / 1024)。 - undefined
@AlexMisiulia kB是指千字节,即1000字节。而1024字节则是基比字节或KiB。 - undefined
@mack我从来没有在科学论文之外看到过kibibyte或KiB这样的用法,通常人们普遍认为一千兆字节等于1024字节,即使这种理解在技术上是不正确的。 - undefined

11

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


16kB是128,000个比特,而不是131,072个比特(或者16 kiB,参见https://en.wikipedia.org/wiki/Binary_prefix)。 - undefined

8

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

以上已经描述了实际编码的增加情况。


9
一个字节变成四个base64字节的极端情况,是不是增加了4倍?更长的源材料可以获得更好的比率,直到接近1.333的渐进值,就像其他人所说的那样。 - Olie

3
这是我的参考资料。由于问题涉及到“最坏情况”,因此我们应该考虑换行符。RFC 1421规定最大行长为64个字符,而RFC 2045(MIME)则规定一行中最多有76个字符。
后者是C#库所实现的。因此,在换行符为2个字符(\r\n)的Windows环境中,我们得到以下公式:Length = Floor(Ceiling(N/3) * 4 * 78 / 76) 注意:这里使用了Floor函数,因为在我的测试中发现,如果最后一行恰好包含76个字符,则不会有换行符。
我可以通过运行以下代码来证明它:
byte[] bytes = new byte[16 * 1024];
Console.WriteLine(Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks).Length);

将16 kBytes编码为base64,每行76个字符的答案是:22422个字符。

在Linux中,假设长度为 Length = Floor(Ceiling(N/3) * 4 * 77 / 76) ,但我还没有测试过它在我的.NET Core上是否可行。


0

另外,这还要取决于实际的字符编码方式。例如,如果我们将其编码为UTF-32字符串,则每个base64字符将消耗3个额外字节(每个字符4个字节)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接