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

Optimization 为什么在Base64编码中使用填充?,optimization,encoding,base64,Optimization,Encoding,Base64,可能重复: 引述: …然后必须使用这些填充字符 在解码时被丢弃,但仍然 允许计算有效载荷 未编码文本的长度,当其 输入二进制长度将不是 3字节的倍数 但是,即使去掉填充字符,也可以轻松地计算长度原始数据 | Encoded |-------------------------------------- Raw Size | Total Size | Real Size | Padding Size 1 | 4

可能重复:

引述:

…然后必须使用这些填充字符 在解码时被丢弃,但仍然 允许计算有效载荷 未编码文本的长度,当其 输入二进制长度将不是 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
.
.
.
因此,给定实际编码大小(第三列),您始终可以正确猜测填充大小:

PaddedSize = 4 * Ceil (RealSize / 4)

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

正如您所注意到的,不管消息的长度如何,结尾填充的长度最多为2个字节,所以这并不是一个真正意义上的节省——更多的是一个微优化。如果您的应用程序既是编码的生产者又是消费者,那么您可以去掉填充,但这并不值得这么麻烦。

Base64很旧,并且源于对可用RAM和CPU有限制的时代。 此外,编写软件更为复杂(与80年代或90年代相比,今天的SDK和工具包对用户更为友好),Base64必须在许多不同的系统架构上运行

也就是说,开发人员可以假设在解码Base64数据之后,“真实”数据的长度大约为n字节;这反过来又让他/她能够更好地管理内存

今天,这真的不再重要了,但回到资源有限的时代,这是一件好事


更新:从未想过5年后我会被否决,但现在我发现我的答案存在问题。我想我们都会变老亲爱的访客,请尽情享受这个答案。

它使编码信息成为4个字符的整数倍。这可能会使编写解码器稍微容易一些。您可以加载和处理4个字符块中的字符,并将它们转换为3个输出字符,而填充使这一操作变得很容易,而不会超出字符串的结尾。

如果这是它的目的,它将能够可靠地完成这一操作,但它不能。是的,在三分之一的情况下,有效的base64编码字符串不会以填充结尾。@Angus,赫曼特:观点很好,经过编辑。@Ignacio:但这个问题不太善于解释原因。我认为只要在问题中加入足够的信息,并以不同的角度提问,就可以允许一些重复(),您可以通过实际编码数据的大小来计算填充字符的数量。因此,如果需要,可以在处理它之前附加它。实际上没有必要通过电线传输它们!通过有线传输它们的成本非常小(每条消息最多2字节)。我猜设计者认为,使其更简单(通过使编码消息由4字节块组成的序列,而不是在末尾有一个可变长度的块)比使其稍微更有效更重要。如果你关心带宽,你不会设计一个使用base64的系统。。。我确实倾向于同意简单部分!只是我假设在技术上需要填充…@Hemant如果填充不是强制性的,那么就排除了基本错误检测的可能性使用读取编码数据(第三列)计算解码数据大小(第一列)非常容易:
firstColumn=thirdColumn*3/4
(假设
firstColumn
thirdColumn
整数变量。看起来像是可以在任何平台上完成的简单整数算法)!