如果服务器收到base64字符串并希望在转换之前检查它的长度,那么它说它总是允许最终字节数组为16KB。转换为Base64字符串时,可能会有多大的16KB字节数组(假设每个字符一个字节)?
答案 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)
注意,给定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内核上进行测试。