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>
运行结果:
YmFzZTY0
base64
上面代码展示了codec对于base64的封装的全部API,用法十分简单,方法见名知意,具体参数含义可以参看注释,平时我们如果需要转换,也可以使用在线工具进行base64的转换,十分方便。
顾名思义,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的转换,十分方便。
相关文章推荐
- Android中扫描wifi信号,收集其所有相关信息,当前连接上的wifi信息程序代码
- apt-install 的一些常用依赖
- C#中的线程(一)入门
- 从【MySQL server has gone away】说起
- 【吐槽】oschina 网站又挂了。。。。
- Ubuntu下 dos2unix:找不到命令 的解决方案
- Codevs 联合权值
- AngularJS学习笔记之directive——scope选项与绑定策略
- Android 解决屏幕适配(尺寸)
- Spring MVC 教程,快速入门,深入分析――核心类与接口
- transitionFromViewController:toViewController 方法的使用
- 2015年10月16日
- MapReduce原理与设计思想
- inner outer
- linux 下Time_wait过多问题解决
- android-Ultra-Pull-To-Refresh 源码解析
- Spring MVC 教程,快速入门,深入分析――前言
- MongoDB的文档、集合和数据库
- 杭电1028
- Fast RCNN 训练自己数据集 (1编译配置)