JAVA BASE64
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的更多相关文章
- java之BASE64加解密
1.简介 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到. 注:位于jdk的java.util包中. 2. ...
- java基础---->Base64算法的使用
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息.详细的Base64信息,可以参见维基百科:https://en.wikipedia.org ...
- Java实现BASE64编解码
Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...
- Java实现BASE64编解码器
Java实现BASE64编解码器 笔者:chszs,转载注明.博客首页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...
- java.util.base64报错解决
java.util.Base64 这个类,它是在 JDK 1.8 的时候加入的,之前版本的标准库没有这个类. eclipse更换jdk1.8就可以了了.
- c++ 与 java 中的 继承
C++ 代码: #include <iostream> #include <string> using namespace std; class Parent { public ...
- Java进行Base64的编码(Encode)与解码(Decode)
关于base64编码Encode和Decode编码的几种方式 Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便 ...
- hello java !
我对于计算机性编程性质的课程一直没有很好的悟性,但功夫不服有心,最近自己学习视频课程,随时关注娄老师的博客,慢慢的对于java编程有了新的认识,也用eclipse软件进行了简单java的编译. 了解的 ...
- java util - base64转换工具
测试代码 package cn.java.codec.base64; public class Test { public static void main(String[] args) { Stri ...
随机推荐
- Matplotlib初体验
为一个客户做了关于每个差异otu在时间点上变化的折线图,使用python第一次做批量作图的程序,虽然是很简单的折线图,但是也是第一次使用matplotlib的纪念. ps:在第一个脚本上做了点小的改动 ...
- JS中闭包、函数与对象的介绍和用法
闭包 闭包概念:当一个内部函数被调用,就会形成闭包,闭包就是能够读取其他函数内部变量的函数,定义在一个函数内部的函,创建一个闭包环境,让返回的这个子程序抓住i,以便在后续执行时可以保持对这个i的引用. ...
- VS2015 查看类之间的继承关系
---恢复内容开始--- 1. 右击项目名称,单击"查看"菜单下的"查看类图"菜单: 2.生成的类图如下:
- Java 测试驱动开发--“井字游戏” 游戏实战
TDD 介绍 TDD是测试驱动开发(Test-Driven Development)的英文简称,是敏捷开发中的一项核心实践和技术,也是一种设计方法论.TDD的原理是在开发功能代码之前,先编写单元测试用 ...
- WKWebView强大的新特性
iOS11对WKWebView的功能进一步完善,新增如下功能: Manager Cookies Fileter unwanted content Provide custom resources 下面 ...
- Java学习笔记11(面向对象四:多态)
多态: 举例:描述一个事物的多种形态,如Student类继承了Person类,一个Student对象既是Student,又是Person 多态体现为:父类引用变量可以指向子类对象 多态的前提:必须有子 ...
- MySQL两阶段提交
参数介绍 innodb_flush_log_at_trx_commit 0: 每隔1s,系统后台线程刷log buffer,也就是把redo日志刷盘,这里会调用fsync,所以可能丢失最后1s的事务. ...
- LeetCode第[1]题(Java):Two Sum 标签:Array
题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...
- EMMC与nand flash的区别【转】
1.NAND Flash 是一种存储介质,要在上面读写数据,外部要加主控和电路设计. 2.eMMC是NAND flash+主控IC ,对外的接口协议与SD.TF卡类似:对厂家而言简化了电路设计,降低了 ...
- 用Windbg来分析.Net程序的dump
介绍 1. 什么是Windbg WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件. WinDbg是微 ...