Base64编码和末尾的等号,而不是A(数字0的base64值)

Base64 encoding and equal sign at the end, instead of A (base64 value of number 0)

根据维基百科:

When the number of bytes to encode is not divisible by three (that is, if there are only one or two bytes of input for the last 24-bit block), then the following action is performed:

Add extra bytes with value zero so there are three bytes, and perform the conversion to base64.

但是,如果我们在末尾有一个额外的 [=10=] 字符,则输入的最后 6 位的值为 0。并且数字 0 必须被 base64 编码为 A .字符 = 甚至不属于 base64 编码 table.

我知道那些额外的空字符不属于原始二进制字符串,因此,我们使用不同的字符 (=) 以避免混淆,但无论如何,维基百科文章和其他数千个站点没有这么说。他们说新构造的字符串必须是base64编码的(严格暗示使用转换的句子table)。

这些网站都错了吗?

从主要 base64 集中选择的任何四个字符序列都将精确地表示三个八位字节的数据。因此,如果要编码的文件的总长度有必要:

  1. 允许编码文件的长度不是4的倍数

  2. 允许编码后的文件有主集64以外的字符。

如果使用前一种方法,则连接的文件长度 不是三的倍数可能会产生一个文件 看似有效但会包含虚假信息。例如,一个文件 长度为 32 将扩展为十组,每组四个 base64 字符加上 最后一对八位字节(总共 43 个)还有三个。连接另一个 长度为 32 的文件将产生总共 86 个字符,这可能看起来 有效,但后半部分的信息无法正确解码。

使用后一种方法,连接长度不是 a 的文件 三的倍数将产生可以明确解析的结果 或者,在最坏的情况下,被认为是无效的(base64 标准不考虑 作为有效的文件,除了末尾之外的任何地方都包含“=”,但可以 编写一个可以明确处理此类文件的解码器)。任何状况之下, 让这样的文件被视为无效会比有文件更好 看起来有效,但在解码时会产生不正确的数据。