Base64编码与解码结果不一致问题求助
解决Base64重新编码与初始字符串不匹配的问题
一、核心原因:初始字符串是URL编码后的Base64
你手里的初始Base64字符串已经做了URL转义处理:%3D是Base64填充字符=的URL编码。而你用Python重新编码得到的是标准Base64格式(直接带==),自然和转义后的初始字符串不一样。
比如base64_str2的原始值eyJzZWN0aW9uX29mZnNldCI6MCwiaXRlbXNfb2Zmc2V0IjowLCJ2ZXJzaW9uIjoxfQ%3D%3D,本质就是标准Base64字符串eyJzZWN0aW9uX29mZnNldCI6MCwiaXRlbXNfb2Zmc2V0IjowLCJ2ZXJzaW9uIjoxfQ==把==替换成了%3D%3D(URL转义)。
解决方法:对重新编码后的Base64做URL转义
在Python里可以用urllib.parse.quote实现:
import base64 from urllib.parse import quote base64_str2_decoded = '{"section_offset":0,"items_offset":0,"version":1}' # 先转成标准Base64字符串,再做URL编码 recoded_str2 = base64.b64encode(bytes(base64_str2_decoded, 'utf-8')).decode('utf-8') url_encoded_recoded = quote(recoded_str2) print(url_encoded_recoded) # 输出:eyJzZWN0aW9uX29mZnNldCI6MCwiaXRlbXNfb2Zmc2V0IjowLCJ2ZXJzaW9uIjoxfQ%3D%3D
二、关于base64_str1解码后多出的'7'
你用在线工具解码base64_str1得到的结果末尾多了个7,这是在线工具的错误。标准Base64解码eyJzZWN0aW9uX29mZnNldCI6MiwiaXRlbXNfb2Zmc2V0IjozNiwidmVyc2lvbiI6MX0=(把%3D还原成=后),正确结果应该是{"section_offset":2,"items_offset":36,"version":1},没有末尾的7。
如果要正确还原base64_str1,需要先把URL转义的%3D还原成=,再解码:
from urllib.parse import unquote import base64 base64_str1 = 'eyJzZWN0aW9uX29mZnNldCI6MiwiaXRlbXNfb2Zmc2V0IjozNiwidmVyc2lvbiI6MX0%3D' # 先URL解码还原成标准Base64 original_b64 = unquote(base64_str1) # 再Base64解码 decoded = base64.b64decode(original_b64).decode('utf-8') print(decoded) # 输出:{"section_offset":2,"items_offset":36,"version":1}
内容的提问来源于stack exchange,提问作者DouxDoux
相关产品推荐
相关产品推荐

