Base64编码说明:

    Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。

为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是Base64名称的由来。

Base64编码表:

package com.sunchao.base64;

/**
* Base64
* @author Administrator
*
*/
public class Base64 {
private static final byte[] CODE;
private static final int[] BI; static{
CODE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
.getBytes();
BI = new int['z' - '+' + 1];
for(int i = 0; i < CODE.length; i++)
BI[CODE[i] - 1] = i;
} private static final int indexOf(byte b){
int index = b - '+';
return BI[index];
} public static byte[] decode(byte[] base64){
if(base64 == null)
throw new NullPointerException(); if(base64.length < 4)
throw new IllegalArgumentException("invalid base64 format!"); int left = 0,right = (base64.length >> 2) * 3;
int len = right;
if(base64[base64.length-2] == '='){
len = right - 2;
right = base64.length-3;
}else if(base64[base64.length-1] == '='){
len = right - 1;
right = base64.length-3;
}
final byte[] result = new byte[len]; for(int i=left,j=0;i<right&&j<len;){
int a = indexOf(base64[i++]);
int b = indexOf(base64[i++]);
int c = indexOf(base64[i++]);
int d = indexOf(base64[i++]);
byte aa = (byte)((a<<2)|((b>>4)&0xF));
byte bb = (byte)(((b & 0xf)<<4)|((c>>2)&0x3F));
byte cc = (byte)((c & 0x3)<<6 | d); result[j++] = aa; if(j >= len)
break;
result[j++] = bb;
if(j >= len)
break;
result[j++] = cc;
}
return result;
} public static byte[] encode(byte[] data, int offset, int len){
if(len == 0) return new byte[0];
checkBounds(data.length, offset, len);
int lp3 = len % 3;
final byte[] result; if(lp3 == 0)
result = new byte[(len / 3) * 4];
else
result = new byte[(len + 3 - lp3) / 3 * 4]; int left = offset, right = offset + len - lp3, i = 0; for(;left < right;){
byte a = data[left++];
byte b = data[left++];
byte c = data[left++];
i = encode(a, b, c, i, result);
}
if(lp3 >= 1){
int a = data[left++];
result[i++] = CODE[(a >> 2) & 0x3f];
int b = left<data.length?data[left++]:0;
int c = left<data.length?data[left++]:0;
result[i++] = CODE[(a & 3)<<4 | ((b>>4)&0xf)];
if(lp3 == 2)
result[i++] = CODE[(b & 0xf)<<2 | ((c>>6)&0x3)];
else
result[i++] = '=';
result[i] = '=';
}
return result;
} private static int encode(byte a, byte b, byte c, int i, byte[] result){
result[i++] = CODE[(a >> 2) & 0x3f];
result[i++] = CODE[(a & 3) << 4 | ((b>>4) & 0xf)];
result[i++] = CODE[(b & 0xf) << 2 | ((c>>6) & 0x3)];
result[i++] = CODE[c & 0x3f];
return i;
} private static void checkBounds(int length, int offset, int charLen){
if(offset < 0) throw new IllegalArgumentException("Negative offset : " + offset);
if(offset > length) throw new IndexOutOfBoundsException("offset over the length : "
+ (offset - length));
if(offset + charLen > length) throw new IndexOutOfBoundsException("offser + charLen - length : "
+ (offset + charLen - length));
}
}

JAVA BASE64的更多相关文章

  1. java之BASE64加解密

    1.简介 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到. 注:位于jdk的java.util包中. 2. ...

  2. java基础---->Base64算法的使用

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息.详细的Base64信息,可以参见维基百科:https://en.wikipedia.org ...

  3. Java实现BASE64编解码

    Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...

  4. Java实现BASE64编解码器

    Java实现BASE64编解码器 笔者:chszs,转载注明.博客首页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...

  5. java.util.base64报错解决

    java.util.Base64 这个类,它是在 JDK 1.8 的时候加入的,之前版本的标准库没有这个类. eclipse更换jdk1.8就可以了了.

  6. c++  与  java  中的 继承

    C++ 代码: #include <iostream> #include <string> using namespace std; class Parent { public ...

  7. Java进行Base64的编码(Encode)与解码(Decode)

    关于base64编码Encode和Decode编码的几种方式 Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便 ...

  8. hello java !

    我对于计算机性编程性质的课程一直没有很好的悟性,但功夫不服有心,最近自己学习视频课程,随时关注娄老师的博客,慢慢的对于java编程有了新的认识,也用eclipse软件进行了简单java的编译. 了解的 ...

  9. java util - base64转换工具

    测试代码 package cn.java.codec.base64; public class Test { public static void main(String[] args) { Stri ...

随机推荐

  1. Head First设计模式之迭代器模式

    一.定义 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示: 主要解决:不同的方式来遍历整个整合对象. 何时使用:遍历一个聚合对象. 如何解决:把在元素之间游走的责任交给迭代 ...

  2. JS中闭包、函数与对象的介绍和用法

    闭包 闭包概念:当一个内部函数被调用,就会形成闭包,闭包就是能够读取其他函数内部变量的函数,定义在一个函数内部的函,创建一个闭包环境,让返回的这个子程序抓住i,以便在后续执行时可以保持对这个i的引用. ...

  3. Maven构建项目比较慢的解决办法

    [前言] Intellij IDEA下Maven构建项目时,构建项目速度比较慢.需要等好久才能构建好一个项目,有时候一下午也还在提示进度. [问题描述] 使用Maven构建项目时: 设置好各种参数,然 ...

  4. 新手OTCBTC注册前一定要看的几个步骤!【安全性相关】

    纽波特市一位名叫詹姆斯·豪威尔的32岁男子,筹集740万英镑给政府,希望政府同意他挖掘当地的一座垃圾填埋场,因为他有一块保存有7500枚比特币(价值人民币8.3亿)的钱包文件的硬盘,就被埋在这座垃圾填 ...

  5. python之Character string

    1.python字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串,l Python不支持单字符类型,单字符也在Python也是作为一个字符串使用. ...

  6. K:树与二叉树

    相关介绍:  树(英语:tree)是一种抽象数据类型(ADT)或是作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成的一个具有层次关系的集合.把它 ...

  7. RedHat7下PostGIS源码安装

    本文介绍在RedHat7环境下安装使用PostGIS的流程. 1. PostgreSQL 1.1 yum安装PostgreSQL 这个比较简单,直接使用yum安装即可. $ sudo yum inst ...

  8. (GO_GTD_1)基于OpenCV和QT,建立Android图像处理程序

    一.创建新QT工程 一定要是全英文路径,比如"E:\android_qt_opencv\GO_GTD" 由于我们在安装的时候,选择android的工具链,所以在这里会出现以下选择, ...

  9. ResourceBundleViewResolver

    1 springmvc中ResourceBundleViewResolver解析器的使用1.1 springmvc.xml的配置因为我配置了多个解析器,所以额外的加了order属性,value值越低, ...

  10. atom编辑器启动后文件不能编辑的解决办法

    今天更新了atom,并且安装了很多插件,突然发现所有页面不能编辑了,如图 这个光标块会自动跳到单词后面,后来发现按一下键盘的字母a就变成正常光标了,至于原因,折腾了一个小时也没发现,后来百度到用Ctr ...