Java编码Base64后Python解码出现Incorrect padding错误求解决
解决Python解码Java编码消息的Padding错误问题
问题根源在于Java生成的JSON字符串格式与Python json.dumps() 的默认输出不一致,导致Base64编码后的内容虽然格式合法,但与Python端预期的输入不匹配。以下是具体调整方案:
调整Java编码逻辑
要让Python端正常解码,必须确保Java生成的JSON字符串与Python json.dumps() 的默认输出完全一致:Python默认会在键值对之间使用 : (冒号加空格),条目之间使用 , (逗号加空格),而Java标准JSONObject.toString()生成的是紧凑格式(无空格)。
方案1:手动构造匹配格式的JSON字符串(适合简单结构)
直接构造与Python输出一致的JSON字符串,再进行Base64编码:
import java.util.Base64; import java.nio.charset.StandardCharsets; import org.json.JSONObject; public class MessageEncoder { public static void main(String[] args) { // 构造与Python json.dumps默认格式一致的JSON字符串 String msgStr = "{\"name\": \"myName\", \"class\": \"myClass\"}"; // 标准Base64编码(带自动填充=) String base64Data = Base64.getEncoder().encodeToString(msgStr.getBytes(StandardCharsets.UTF_8)); // 组装最终消息 JSONObject obj = new JSONObject(); obj.put("data", base64Data); // 输出或传输obj.toString() System.out.println(obj.toString()); } }
方案2:使用JSON库生成匹配格式的字符串(适合复杂结构)
如果消息结构复杂,手动构造容易出错,可以用Gson库配置分隔符生成匹配格式的JSON:
import java.util.Base64; import java.nio.charset.StandardCharsets; import com.google.gson.stream.JsonWriter; import java.io.StringWriter; import org.json.JSONObject; public class MessageEncoder { public static void main(String[] args) throws Exception { StringWriter sw = new StringWriter(); JsonWriter writer = new JsonWriter(sw); writer.setIndent(""); // 禁用缩进,保持紧凑但带必要空格 // 构造JSON对象 writer.beginObject(); writer.name("name").value("myName"); writer.name("class").value("myClass"); writer.endObject(); writer.close(); String msgStr = sw.toString(); // 生成与Python一致的JSON字符串 String base64Data = Base64.getEncoder().encodeToString(msgStr.getBytes(StandardCharsets.UTF_8)); JSONObject obj = new JSONObject(); obj.put("data", base64Data); System.out.println(obj.toString()); } }
关键注意事项
- 必须使用标准Base64编码器:
Base64.getEncoder()(自动添加填充=),不要使用withoutPadding()模式,否则会触发Python端的binascii.Error。 - 强制指定UTF-8编码:始终显式使用
StandardCharsets.UTF_8,避免依赖系统默认编码导致字节数差异。
内容的提问来源于stack exchange,提问作者lakshmiravali rimmalapudi
相关产品推荐
相关产品推荐

