赞
踩
Base64是一种将二进制流表示为 64 个字符的编码方式。标准的 Base64 使用的索引表为:
举个例子,字符串"Base64 编码"经过编码后的结果为:QmFzZTY0IOe8lueggQ==。当然,这里隐含了以UTF-8作为字符编码的前提,如果使用了其他的字符编码方式,用Base64编码后就不是这个结果了。很多在线编解码的网站其实也是默认使用了UTF-8,但是没有明确说明。
第一步: 找到中文字符在操作系统中对应字符编码表代码(chcp)
第二步:中文找到字符编码中的十进制值
在线进制转换
第三步:把十进制转换为二进制
第四步:对二进制进行分组,每6个一组,在转十进制
第五步:去Base64表中去查找其对应的编码
天天向商
52448+12=52460
53232+2=53234
51648+12=51660
zOzM7M/yycw=
110011 001110 110011 001100 111011 001100
51 14 51 12 59 12
111111 110010 110010 011100 110000
63 50 50 28 48
整个编码步骤并不复杂,我们用一张示意图表示为:
Base64能够将任何数据转换为易移植的字符串,避免了传输过程中失真问题。最初,Base64是为了解决电子邮件中无法直接使用非ASCII字符的问题。一段数据先经过Base64编码为ASCII字符串后,可以在接收端,通过Base64解码还原为原数据后,而无需担心传输过程中失真。
很多时候,我们都将Base64编码作为数据加密后的传输 / 存储格式。例如,一段明文数据通过MD5 、SHA等手段加密后,经过Base64编码为字符串,就可以很方便地进行传输 & 存储。再比如,网络上的数字证书其实也是使用Base64编码的形式传输的,我们可以在浏览器上查看百度官网的数字证书:
需要注意的是,Base64并不是一种加密方式,明文使用Base64编码后的字符串通过索引表可以直接还原为明文。因此,Base64只能作为一种数据的存储格式。
在Java 8之前,JDK中并没有提供Base64的算法实现,这其实挺让人纳闷的。虽然源码中sun.misc.BASE64Encoder,但是它其实并不是公有 API,而是 sun 团队内部使用的 API,最好不要在生产中使用。从Java 8,JDK 总算是补充了Base64的实现,例如:
import java.util.Base64;
标准 Base 64
System.out.println(Base64.getEncoder().encodeToString("".getBytes()));
Url Base 64
System.out.println(Base64.getUrlEncoder().encodeToString("".getBytes()));
MIME Base 64
System.out.println(Base64.getMimeEncoder().encodeToString("".getBytes()));
在Java 8之前,Bouncy Castle和Apache也提供了Base64的算法实现。
Android SDK提供了Base64的算法实现,例如:
import android.util.Base64;
System.out.println(Base64.encodeToString("".getBytes(),Base64.DEFAULT));
相对于Java 8的算法实现,Android提供的 API 更为灵活,可以通过flag自定义控制算法的输出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。