为什么在Base64编码中使用填充?

Hem*_*ant 5 optimization base64 encoding

可能重复:
如果输入长度不能被3整除,为什么base64编码需要填充?

引用维基百科:

...这些填充字符必须在解码时被丢弃,但仍允许计算未编码文本的有效长度,此时其输入二进制长度不是3个字节的倍数....

但即使剥离填充字符,也可以轻松地计算长度原始数据.

          |               Encoded
          |--------------------------------------
Raw Size  | Total Size | Real Size | Padding Size
1         | 4          | 2         | 2
2         | 4          | 3         | 1
3         | 4          | 4         | 0
4         | 8          | 6         | 2
5         | 8          | 7         | 1
6         | 8          | 8         | 0
7         | 12         | 10        | 2
8         | 12         | 11        | 1
9         | 12         | 12        | 0
10        | 16         | 14        | 2
.
.
.
Run Code Online (Sandbox Code Playgroud)

因此,考虑到实际编码大小(第三列),您始终可以正确猜出填充大小:

PaddedSize = 4 * Ceil (RealSize / 4)
Run Code Online (Sandbox Code Playgroud)

所以从理论上讲,不需要填充.算法会处理它.考虑到Base64编码是一种流行的行业标准,它被用于许多应用程序和设备中.这些将受益于减少的编码大小.所以问题是,为什么在Base64编码中使用填充?

Ang*_*gus 7

它使编码的消息成为 4 个字符的整数倍。这可能会使编写解码器稍微容易一些。您可以以 4 个块为单位加载和处理字符并将它们转换为 3 个输出字符,并且填充可以轻松完成此操作而不会超出字符串的末尾。

  • 通过线路传输它们的成本非常小(每条消息最多 2 个字节)。我猜设计者认为让它更简单(通过使编码消息成为一个 4 字节块的序列,而不是在末尾有一个可变长度的块)比使它稍微更有效更重要。如果您担心带宽,您无论如何都不会设计一个使用 base64 的系统。 (3认同)