如果服务器接收到一个base64字符串,并希望在转换之前检查它的长度,假设它总是允许最终的字节数组为16KB。一个16KB字节的数组转换为Base64字符串(假设每个字符一个字节)时可能会变成多大?
当前回答
这是我将来的参考。既然问题是关于最坏的情况,我们应该考虑换行。RFC 1421定义的最大行长是64个字符,而RFC 2045 (MIME)规定一行最多有76个字符。
后者是c#库实现的。所以在Windows环境中,换行符是2个字符(\r\n),我们得到这样的长度=地板(天花板(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中它是长度=地板(天花板(N/3) * 4 * 77 / 76),但我还没有在我的。net核心上测试它。
其他回答
这是我将来的参考。既然问题是关于最坏的情况,我们应该考虑换行。RFC 1421定义的最大行长是64个字符,而RFC 2045 (MIME)规定一行最多有76个字符。
后者是c#库实现的。所以在Windows环境中,换行符是2个字符(\r\n),我们得到这样的长度=地板(天花板(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中它是长度=地板(天花板(N/3) * 4 * 77 / 76),但我还没有在我的。net核心上测试它。
由于这个问题是关于最糟糕的增加,我必须补充一下,通常在每80个字符左右有换行符。这意味着如果你在Windows上将base64编码的数据保存到一个文本文件中,它将增加2个字节,在Linux上为每行增加1个字节。
上面已经描述了实际编码的增加。
从维基百科
注意,给定一个n字节的输入, 输出将是(n + 2 - (n + 2) % 3)) / 3 * 4字节长,使 每个输入字节的输出字节数 收敛于4 / 3或1.33333 大n。
所以16kb * 4 / 3只提供了21.3' kb,确切地说是21848字节。
希望这能有所帮助
16kb是131,072位。Base64将24位缓冲区打包成4个6位字符,因此您将有5,462 * 4 = 21,848字节。
Base64将每组3个字节编码为4个字节。此外,输出被填充为始终是4的倍数。
这意味着大小为n的字符串的base-64表示的大小为:
ceil(n / 3) * 4
因此,对于一个16kB数组,base-64表示将是ceil(16*1024/3)*4 = 21848字节长~= 21.8kB。
粗略估计,数据的大小将增加到原始数据的4/3。
推荐文章
- 可能增加的最坏的空间使用量是多少?
- Base64长度计算?
- 如何将base64编码的映像保存到磁盘?
- 如何将Base64字符串转换为位图图像,以显示在一个ImageView?
- 用base64编码图像文件
- 如何在iOS上进行base64编码?
- 有人知道如何解码和编码Base64中的字符串使用Base64吗?
- 在UIImage和Base64字符串之间转换
- 如何检查一个字符串是否被Base64编码
- 如何保存一个PNG图像服务器端,从base64数据URI
- 如何解码Python中的Base64数据?
- ArrayBuffer到base64编码的字符串
- 在URL中传递base64编码的字符串
- 为什么我需要'b'编码一个字符串与Base64?
- 如何在JavaScript中转换文件到base64 ?