使用B64解码时,它不会删除Base64编码中添加的填充额外字节吗?
考虑我给编码函数提供大小为50(不是3的倍数)的数据的情况,这会返回大小为68的编码数据。 在对编码数据使用解码(输入68字节)时,解码函数返回51字节数据,我期望为零。
当数据大小不是3的倍数时,如何正确处理base 64编码/解码?
我使用的开源Base64编码/解码库符合RFC4648.properly
答案 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的倍数。 换句话说,如果有'='(单个等于)字符,那么可能剩下两个八位字节,如果有'==',则单个八位字节留在最后一组三个字符中。