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. Python Tkinter模块 Grid(grid)布局管理器参数详解

    在使用Tkinter模块编写图像界面时,经常用到pack()和grid()进行布局管理,pack()参数较少,使用方便,是最简单的布局,但是当控件数量较多时,可能需要使用grid()进行布局(不要在同 ...

  2. MySQL 优化实施方案

    1.1 前言 在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已.更多关于MySQL查询相关参照 ...

  3. webapi框架搭建-日志管理log4net

    前言 本篇讲怎么在前几篇已经创建好的项目里加上日志处理机制,我们采用Log4net技术.跟多的log4net技术的细节请查阅log4net的官网. log4net官网:http://logging.a ...

  4. Java学习笔记13(面向对象六:super)

    在创建子类对象时,父类的构造方法会先执行,因为子类中所有构造方法的第一行有默认的隐式super();语句 注意:父类构造方法第一行也有隐式的super(); 所有类都有一个"祖宗类" ...

  5. Nginx配置反向代理

    Nginx可做web服务器,也可做负载均衡使用. 反向代理:应用服务器不直接提供服务,通过nginx服务器处理请求, 转发到代理服务器(Tomcat,Nginx,Apache等) 获取响应交给客户端, ...

  6. Percona XtraBackup的部分备份与恢复/单库备份/单表备份/指定库备份/指定表备份

    本文是翻译的Percona XtraBackup 2.2版的官方文档,原文地址在此:https://www.percona.com/doc/percona-xtrabackup/2.2/innobac ...

  7. [转]Django时间查询

    1.gt:大于某个时间 now = datetime.datetime.now() 前一天 start = now – datetime.timedelta(hours=23, minutes=59, ...

  8. 如何识别IDA反汇编中遇到的动态链接库中的函数

    在使用IDA静态反汇编时,如果正在逆向的文件中有动态链接库函数(比如调用了程序自定义so库中的函数),IDA只会显示一个地址,跟进去会发现是延迟绑定中关于plt的代码,无法知道具体调用了哪个函数,对于 ...

  9. 前端 IoC 理念入门

    背景 近几年,前端应用(WebApp)正朝着大规模方向发展,在这个过程中我们会对项目拆解成多个模块/组件来组合使用,以此提高我们代码的复用性,最终提高研发效率. 在编写一个复杂组件的时候,总会依赖其他 ...

  10. CTF---密码学入门第六题 古典密码

    古典密码分值:10 来源: 北邮天枢战队 难度:易 参与人数:5115人 Get Flag:1549人 答题人数:1783人 解题通过率:87% 密文内容如下{79 67 85 123 67 70 8 ...