B64编码/解码处理,以防数据不是3的倍数

时间:2013-11-19 07:43:49

标签: c++ base64 decode encode

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

对于最后一个,如果只剩下两个八位字节,则将它们编码成三个字符(每个字符取六位=十八位,十六位真实数据和两位垃圾)然后添加一个特殊的填充=给四个字符的字符。

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

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

换句话说,输入数据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

答案 1 :(得分:0)

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