【问题标题】:Base64 encoding and equal sign at the end, instead of A (base64 value of number 0)Base64 编码和末尾的等号,而不是 A(数字 0 的 base64 值)
【发布时间】:2017-01-20 07:24:31
【问题描述】:

根据维基百科:

当要编码的字节数不能被三整除时(即 如果最后 24 位只有一个或两个字节的输入 块),然后执行以下操作:

添加值为零的额外字节,因此有三个字节,然后执行 转换为 base64。

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

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

这些网站都错了吗?

【问题讨论】:

    标签: base64


    【解决方案1】:

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

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

    2. 允许编码文件包含 64 个主要字符集之外的字符。

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

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

    【讨论】:

    • 我不是在问 base64 编码实际上是如何工作的,我知道,但为什么它被普遍解释为:“添加空值并对其进行编码”,当它实际翻译为“添加等于”时,当“相等”不是数字 0 的 base64 编码(这与“编码它”的确认相矛盾)。如果您因为我的英语而误解了我的问题,请告诉我,我会改进措辞。
    • @Peregring-lk:编码一两个字节时,编码形式的位数会超过原始输入数据的位数;该规范的目的是说明应该如何处理多余的位。编码器不必实际附加空值,处理最后一个“三元组”,然后用等号替换一个或两个“a”,但这是描述如何将 8 或 16 位映射到 12 或18.
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2011-05-22
    • 1970-01-01
    • 2011-05-28
    • 2018-02-24
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    相关资源
    最近更新 更多