您的位置:首页 > 其它

Base64算法

2015-10-16 16:37 716 查看
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的转换,十分方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: