【问题标题】:Base64: What is the worst possible increase in space usage?Base64:空间使用量的最大可能增长是多少?
【发布时间】:2011-06-10 13:37:04
【问题描述】:

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

【问题讨论】:

    标签: base64 expansion


    【解决方案1】:

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

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

    ceil(n / 3) * 4
    

    因此,对于 16kB 数组,base-64 表示将是 ceil(16*1024/3)*4 = 21848 字节长 ~= 21.8kB。

    粗略的近似是数据的大小增加到原来的 4/3。

    【讨论】:

    • 长度是否需要加2?
    • @vIceBerg,这取决于您是使用带有float 数字的ceil,还是仅使用int 数字。 (没有ceil
    • 我想更简单的表达方式是添加原始大小的 1/3。
    • 在您提出的示例中,以相同的测量顺序显示结果会稍微提高答案的质量(21,3 KB 而不是 21848 字节)。
    【解决方案2】:

    来自Wikipedia

    请注意,给定 n 个字节的输入, 输出将是 (n + 2 - ((n + 2) % 3)) / 3 * 4 字节长,这样 每个输入字节的输出字节数 收敛到 4 / 3 或 1.33333 n 大。

    因此,准确地说,16kb * 4 / 3 仅提供 21.3' kb 或 21848 字节的空间。

    希望对你有帮助

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 1个源字节变成4个base64字节不是极端情况,所以增加了4倍?任何更长的源材料都会获得更好的比率,直到正如其他人所说,它逐渐接近 1.333...
        【解决方案5】:

        这是我未来的参考。由于问题是关于 worst 的情况,我们应该考虑换行符。虽然 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 kBytes 的答案:22422 个字符

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

        【讨论】:

          猜你喜欢
          • 2011-06-01
          • 1970-01-01
          • 2010-09-13
          • 1970-01-01
          • 2014-05-08
          • 2010-10-23
          • 2011-11-24
          • 1970-01-01
          • 2010-11-06
          相关资源
          最近更新 更多