Java中无法正确解码Base64 MIME图片为字节数组(Selenium测试场景)
解决Base64解码PNG时的IDAT解压错误问题
我之前碰到过几乎一模一样的问题,你的情况大概率是从src属性拿到的Base64字符串里藏着URL编码的换行符(就是你示例里的%0A),这些字符不属于Base64的有效字符集,直接解码会导致字节数组损坏,生成的PNG自然打不开。
先看你当前的代码:
String base64Source = LocalDriverManager.get().findElement(By.xpath("//img[@class='qr-code']")).getAttribute("src"); String base64Image = base64Source.split(",")[1]; byte[] decoded = Base64.getMimeDecoder().decode(base64Image); try (OutputStream stream = new FileOutputStream("QR_CODE.png")){ stream.write(decoded); }
你拆分出来的base64Image里包含%0A(URL编码后的换行),Base64解码器根本认不出%这类字符,解码后的字节流直接出错,这就是PNG提示“IDAT解压错误”的原因。
修复方案
只需要在Base64解码前,先给base64Image做一次URL解码,把URL编码的字符还原成原始的Base64格式:
import java.net.URLDecoder; import java.nio.charset.StandardCharsets; // ... 你的原有代码逻辑 String base64Source = LocalDriverManager.get().findElement(By.xpath("//img[@class='qr-code']")).getAttribute("src"); String base64Image = base64Source.split(",")[1]; // 新增URL解码步骤,还原原始Base64字符串 String decodedBase64 = URLDecoder.decode(base64Image, StandardCharsets.UTF_8); byte[] decoded = Base64.getMimeDecoder().decode(decodedBase64); try (OutputStream stream = new FileOutputStream("QR_CODE.png")){ stream.write(decoded); }
为什么在线转换器能成功?
很多在线Base64转图片工具会自动处理URL编码字符,悄悄把%0A这类转义符还原成换行,所以你用在线工具能正常转换,但代码里没做这一步就会出问题。
修改后再运行代码,生成的PNG应该就能正常打开了,之后也可以用ZXing顺利解析QR码内容。
内容的提问来源于stack exchange,提问作者turbotramp
相关产品推荐
相关产品推荐

