Base64编码出现换行符

概述

Base64是一种字符串编码格式,Base64采用A-Z a-z 0-9 “+“ “/“这一共64个字符来编码原始字符(还有垫字符“=“)。一个字符本身是1个字节,也就是8位,而Base64编码后的一个字符只能表示能表示6位的信息。也就是原始字符串中3字节的信息编码会变成4字节的信息。Base64的主要作用是满足MIME传输需求,在传输过程中都是用ASCII支持的可见字符。Base64是基于字节的编码,所以不同字符集下的相同字符在Base64下可能有着不同编码

问题描述

在进过Base64编码后的字符串无法解码,解码时提示RuntimeError
将编码后的字符串输出后发现字符串中存在换行符(包括用mysql自带的Base64函数也会有换行)

测试程序

复制代码
1 import it.sauronsoftware.base64.Base64;
2 
3 public class TestBase64 {
4     public static void main(String[] args){
5         String message = "{\"begin_time\":\"2016-09-13T19:06:00+08:00\",\"end_time\":\"2016-10-29T19:06:00+08:00\",\"name\":\"testExam\",\"score\":[{\"score\":\"0\",\"qid\":\"1\"}],\"questions\":[{\"name\":\"A+B\",\"qid\":\"1\"}],\"eid\":\"1\"}";
6         System.out.println(Base64.encode(message));
7 
8     }
9 }
复制代码

程序输出

eyJiZWdpbl90aW1lIjoiMjAxNi0wOS0xM1QxOTowNjowMCswODowMCIsImVuZF90aW1lIjoiMjAx
Ni0xMC0yOVQxOTowNjowMCswODowMCIsIm5hbWUiOiJ0ZXN0RXhhbSIsInNjb3JlIjpbeyJzY29y
ZSI6IjAiLCJxaWQiOiIxIn1dLCJxdWVzdGlvbnMiOlt7Im5hbWUiOiJBK0IiLCJxaWQiOiIxIn1d
LCJlaWQiOiIxIn0=

观察测试结果

base64编码后出现了换行符
如果去除换行符 字符串能正常解码

原因分析

根据RFC822规定,BASE64Encoder编码每76个字符,还需要加上一个回车换行
部分Base64编码的java库还按照这个标准实行

解决方案

换用Apache的 commons-codec.jar,org.apache.commons.codec.binary.Base64.encodeBase64String(byte[])得到的编码字符串是不带换行符的(mysql的from_base64函数也可以解析)

也可以用org.apache.commons.codec.binary.Base64.decodeBase64(byte[])来解析带换行符的编码字符串

 

参考:https://blog.csdn.net/u010953266/article/details/52590570

 

posted @   Boblim  阅读(2651)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2017-07-05 配置Yum源repo文件及搭建本地Yum服务器
2017-07-05 yum命令
点击右上角即可分享
微信分享提示