Base64算法

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的转换,十分方便。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值