如果服务器接收到一个base64字符串并想要在转换之前检查其长度,比如说它希望始终允许最终的字节数组为16KB。当将一个16KB的字节数组转换为Base64字符串时,这个字节数组可能会有多大(假设每个字符占用一个字节)?
Base64将每个三个字节的数据编码为四个字节输出,并且输出总是被填充为四的倍数。
这意味着一个长度为n的字符串经过base-64编码后的大小为:
ceil(n / 3) * 4
因此,对于一个16KB的数组,它的base-64表示将会是 ceil(16*1024/3)*4 = 21848 字节长,大约21.8KB。
一个粗略的估算是数据大小增加到原始大小的4/3。
来自维基百科
请注意,对于n个字节的输入, 输出将是(n + 2 - ((n + 2) % 3)) / 3 * 4个字节长,因此 每个输入字节的输出字节数 收敛到4/3或1.33333,适用于 大n。
所以16kb * 4 / 3大约为21.8 kb,或者准确地说是21,848个字节。
希望这可以帮助您。
16kb等于131,072位。Base64将24位缓冲区打包成每组四个6位字符,因此您将获得5,462 * 4 = 21,848字节。
由于问题涉及最坏的可能增加情况,因此我必须补充说明:通常在每80个字符左右会有一个换行符。这意味着,如果您将base64编码数据保存到Windows文本文件中,它将为每行添加2个字节,在Linux上为1个字节。
以上已经描述了实际编码的增加情况。
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上是否可行。
另外,这还要取决于实际的字符编码方式。例如,如果我们将其编码为UTF-32字符串,则每个base64字符将消耗3个额外字节(每个字符4个字节)。
float
数字与ceil
或仅使用int
数字(且没有ceil
)。 - 700 Software