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 集中选择的任何四个字符序列都将精确地表示三个八位字节的数据。因此,如果要编码的文件的总长度有必要:
允许编码文件的长度不是4的倍数
允许编码后的文件有主集64以外的字符。
如果使用前一种方法,则连接的文件长度
不是三的倍数可能会产生一个文件
看似有效但会包含虚假信息。例如,一个文件
长度为 32 将扩展为十组,每组四个 base64 字符加上
最后一对八位字节(总共 43 个)还有三个。连接另一个
长度为 32 的文件将产生总共 86 个字符,这可能看起来
有效,但后半部分的信息无法正确解码。
使用后一种方法,连接长度不是 a 的文件
三的倍数将产生可以明确解析的结果
或者,在最坏的情况下,被认为是无效的(base64 标准不考虑
作为有效的文件,除了末尾之外的任何地方都包含“=”,但可以
编写一个可以明确处理此类文件的解码器)。任何状况之下,
让这样的文件被视为无效会比有文件更好
看起来有效,但在解码时会产生不正确的数据。
根据维基百科:
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 集中选择的任何四个字符序列都将精确地表示三个八位字节的数据。因此,如果要编码的文件的总长度有必要:
允许编码文件的长度不是4的倍数
允许编码后的文件有主集64以外的字符。
如果使用前一种方法,则连接的文件长度 不是三的倍数可能会产生一个文件 看似有效但会包含虚假信息。例如,一个文件 长度为 32 将扩展为十组,每组四个 base64 字符加上 最后一对八位字节(总共 43 个)还有三个。连接另一个 长度为 32 的文件将产生总共 86 个字符,这可能看起来 有效,但后半部分的信息无法正确解码。
使用后一种方法,连接长度不是 a 的文件 三的倍数将产生可以明确解析的结果 或者,在最坏的情况下,被认为是无效的(base64 标准不考虑 作为有效的文件,除了末尾之外的任何地方都包含“=”,但可以 编写一个可以明确处理此类文件的解码器)。任何状况之下, 让这样的文件被视为无效会比有文件更好 看起来有效,但在解码时会产生不正确的数据。