【问题标题】:B64 encode/decode handling in case data is not in multiple of 3如果数据不是 3 的倍数,则 B64 编码/解码处理
【发布时间】:2013-12-02 16:05:24
【问题描述】:

在使用 B64 解码时,它不会删除在 Base64 编码中添加的填充额外字节?

考虑我将大小为 50(不是 3 的倍数)的数据提供给编码函数的场景,这将返回大小为 68 的编码数据。 在对编码数据(68 字节的输入)使用解码时,解码函数返回 51 字节的数据,我期望它为零。

当数据大小不是3的倍数时如何正确处理base 64编码/解码?

我使用了符合 RFC4648.properly 的开源 Base64 编码/解码库

【问题讨论】:

    标签: c++ base64 decode encode


    【解决方案1】:

    Base64 编码在末尾使用特殊标记来指示添加了填充。

    总是生成四个输出字符的倍数,每个输出字符对应于三个八位字节的输入数据,可能最后一个除外。

    对于最后一个,如果只剩下两个八位字节,它会将它们编码为三个字符(每个占用 6 位 = 18、16 位实际数据和 2 位垃圾),然后添加一个特殊的填充 = 字符到给出四个字符。

    如果只剩下 一个 八位字节,它会将其编码为两个字符(十六位、十二位真实数据和四位垃圾),然后添加一个特殊的填充 == 字符以给出四个字符。

    因此,在解码过程中,末尾的 = 字符数告诉您如何处理最后一部分,以便最终得到与您编码的数据完全相同的数据。

    换句话说,输入数据AAAA(每个A持有位abcdef)给出:

    decoding input: abcdef abcdef abcdef abcdef
                                 |
                                 V
            output: abcdefab cdefabcd efabcdef
    

    对于稍短的块AAA=(无关位为+,填充位为=):

    decoding input: abcdef abcdef abcd++ ======
                                 |
                                 V
            output:      abcdefab cdefabcd
    

    还有一个很短的区块AA==

    decoding input: abcdef ab++++ ====== ======
                                 |
                                 V
            output:           abcdefab
    

    【讨论】:

    • 感谢您的解释,但是您给出的示例对我来说仍然不清楚,例如输入数据为“AAAA”的第一种情况,如果它被分成三个字符的组,那么“AAA” ' 将被编码为四位数字,对于最后一个 'A' 编码器可能会在 RHS 端添加一些额外的零,然后对其进行编码并在输出处附加 '=='。或者可能是我理解错了,请你说清楚。
    【解决方案2】:

    所以这里 '=' 用作 base64 编码的填充字符。 通过确定编码数据末尾的“=”字符数,我可以确定输入数据是否为 ​​3 的倍数。 换句话说,如果有 '='(单个等于)字符,则可能剩下两个八位字节,如果有 '==',则最后一组三个字符中剩下单个八位字节。

    【讨论】:

      猜你喜欢
      • 2023-01-30
      • 2014-09-03
      • 2011-04-20
      • 2017-03-23
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      相关资源
      最近更新 更多