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. Robot Framework学习笔记(一)------环境搭建

    Robot Framework是一款python编写的功能自动化测试框架.具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行. 所需环境 一.安装pyth ...

  2. SpringMVC 如何在页面中获取到ModelAndView绑定的值

    springMVC中通过ModelAndView进行后台与页面的数据交互,那么如何在页面中获取ModelAndView绑定的值呢? 1.在JSP中通过EL表达式进行获取(比较常用) 后台:ModelA ...

  3. 【练习】jQuery

    作业要求: 参考下图,点击展示不同内容. 例: <!DOCTYPE html> <html lang="en"> <head> <meta ...

  4. 6年后的第一篇博客:进入java的精彩世界

    10的.NET从业经验,也算资深人士了. 2018开始,正式进入JAVA的世界. 为什么说正式?因为已经附带有几年ANDROID经验了,确切的说,是正式进入JAVA服务器端. 没有任何人要求,纯粹是个 ...

  5. 用call和ret实现子程序

    ret和call是另外两种转移指令,它们与jmp的主要区别是,它们还包含入栈和出栈的操作.具体的原理如下: ret操作相当于:pop ip(直接将栈顶元素赋值给ip寄存器) call s的操作相当于: ...

  6. K:树、二叉树与森林之间的转换及其相关代码实现

    相关介绍:  二叉树是树的一种特殊形态,在二叉树中一个节点至多有左.右两个子节点,而在树中一个节点可以包含任意数目的子节点,对于森林,其是多棵树所组成的一个整体,树与树之间彼此相互独立,互不干扰,但其 ...

  7. 【转载】linux挂载mount参数优化

    一. 1) 蓝色:表示经过优化的xfs mount时的参数defaults,noatime,nodiratime,nobarrier,discard,allocsize=256m,logbufs=8, ...

  8. SQLServer 创建服务器和数据库级别审计

    概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 一.常用的审核对象 1.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit L ...

  9. mysql数据库快速入门(1)

    1.数据库操作 1.1.连接mysql服务器 mysql -u root( 用户名 ) -p 1.2.退出mysql命令提示窗 exit 1.3.查看版本 SELECT VERSION(); 1.4. ...

  10. NEST 中的时间单位

    Time units 英文原文地址:Time units 与 Elasticsearch 交互,我们会遇到需要设定时间段的情况(例如:timeout 参数).为了指定时间段,我们可以使用一个表示时间的 ...