Base64算法的前世,据说在早期的电子邮件传输的过程中,仅仅支持ASCII码的传输,如果一些非ASCII码也通过电子邮件进行传输,那么通过网关的时候,会在高位补0,从而接收方会收到一堆乱码,为了解决这个问题,Base64应运而生,现在base64广泛应用于对浏览器地址栏url的编码、避免静态图片资源重复通过http请求访问服务器下载图片而直接将图片转为base64放在html页面上和简单的加解密等方面。
顾名思义,Base64,基于64个字符的编码算法,如下图。
这64个字符分别是大写A-Z,小写a-z,0-9以及+、/、=组成的,其中“=”是用来进行补位的。
Base64的实现原理,主要需要进行以下六步操作:
1.将给定字符串每个字符转换为ASCII码对应的字符编码。
2.将字符编码转换为对应的二进制码。
3.分组操作,3个8位二进制码(3个字节)转换为4个6位二进制码,如果转换后不足6位的那么在后面进行补0填充。
4.在4个6位二进制码的高位,也就是左侧,添加2位0进行补位。
5.将此时的4个8位二进制码(4个字节)转化为对应的十进制码。
6.查字典,找到该十进制码对应Base64表中对应的字符。
从上面的原理我们可以清楚的看到,Base64转化的过程其实就是分组、补位的一个过程,每一组由起初的3个字节变成分组后的4个字节,数据长度增加了4/3,字符串字符都是以4为单位的整数倍。
平时我们一般使用apache的codec来进行base64的编解码,以后我们还会使用到codec来进行md5、sha等信息摘要的处理。
codec的maven依赖(目前最新的是1.10版本):
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
package com.liuqiang.base64;
import java.io.UnsupportedEncodingException;
import org.apache.commons.codec.binary.Base64;
public class Base64Coder {
private static final String ENCODING = "utf-8";
/**
*
* @param data
* @return
* @throws UnsupportedEncodingException
********* *** ********* ********* ********* * *
* * * * * * * * *
********* ******* ********* ********* ********* *********
* * * * * * * * *
********* * * ********* ********* ********* *
* binaryData - Array containing binary data to encode.
* isChunked - if true this encoder will chunk the base64 output into 76 character blocks /r/n
* urlSafe - if true this encoder will emit - and _ instead of the usual + and / characters. Note: no padding is added when encoding using the URL-safe alphabet.
* maxResultSize - The maximum result size to accept.
*/
public static String base64Encoder(String data) throws UnsupportedEncodingException{
byte [] binaryData = data.getBytes(ENCODING);
//chunked、urlsafe、maxResultSize均默认false
Base64.encodeBase64(binaryData);
//chunked可设置,urlsafe、maxResultSize默认false
Base64.encodeBase64(binaryData, true);
//chunked、urlsafe可设置,maxResultSize默认false
Base64.encodeBase64(binaryData, true, true);
//chunked、urlsafe、maxResultSize均可设置
Base64.encodeBase64(binaryData, true, true, 60);
//默认chunked为true
Base64.encodeBase64Chunked(binaryData);
//默认urlSafe为true
Base64.encodeBase64URLSafe(binaryData);
//默认urlSare为true,返回字符串
Base64.encodeBase64URLSafeString(binaryData);
//chunked、urlsafe、maxResultSize均默认false,返回字符串
return Base64.encodeBase64String(binaryData);
}
public static String base64Decoder(String data) throws UnsupportedEncodingException{
byte [] binaryData = data.getBytes(ENCODING);
//接收字符串
Base64.decodeBase64(data);
//pArray - a byte array containing base64 character data
Base64.decodeInteger(binaryData);
//接字节数收组
return new String(Base64.decodeBase64(binaryData),ENCODING);
}
public static void main(String[] args) {
String data = "base64";
try {
String encode = base64Encoder(data);
String decode = base64Decoder(encode);
System.out.println(encode);
System.out.println(decode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}</span>
运行结果:
YmFzZTY0
base64
上面代码展示了codec对于base64的封装的全部API,用法十分简单,方法见名知意,具体参数含义可以参看注释,平时我们如果需要转换,也可以使用在线工具进行base64的转换,十分方便。