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 ...
随机推荐
- MyEclipse 2015利用Cygwin+CDT搭建C/C++开发环境
GitHub原文:https://github.com/x113773/testall/issues/22 首先安装Cygwin 1:首先去网站 www.cygwin.com 下载 Cygwin 的 ...
- angular4.0配置同时使用localhost和本机IP访问项目
之前写过<angular4.0配置本机IP访问项目>的文章,今天再次更新一个,谢谢大家的指正. 今天的目的是:使用本机IP地址,或者localhost都可以访问项目. 第一步:找到此文件& ...
- python并发之多线程
一开启线程的两种方式 from threading import Thread import time def haha(name): time.sleep(2) print('%s 你大爷..... ...
- 自学Aruba3.1-Aruba配置架构
点击返回:自学Aruba之路 自学Aruba3.1-Aruba配置架构 WLAN配置架构 1. AP group : Aruba无线控制器通过AP Group来构建无线网络配置参数模版.并通过 ...
- JPG .vs. PNG
A summary of comparison between JPEG and PNG JPEG Pros Smaller file size than PNG Widely suppported ...
- MySQL 5.7 InnoDB缓冲池NUMA功能支持——但是别高兴的太早
当前CPU都已是NUMA架构,相信除了历史遗留系统,很少会有数据库跑在SMP的CPU上了.NUMA架构带来的优势无言而语,CPU更快的内存访问速度,但是带来的问题也不言而喻,特别是对于数据库的影响.M ...
- 分析uboot中 make xxx_config过程
make xxx_config实质上就是调用了 首先看MKCONFIG: [注意]SRCTREE=源文件下的目录 之后的语句: @$(MKCONFIG) $(@:_config=) arm arm92 ...
- Zabbix实战-简易教程系列
一.基础篇(安装和接入) Zabbix实战-简易教程--总流程 Zabbix实战-简易教程--整体架构图 Zabbix实战-简易教程--DB安装和表分区 Zabbix实战-简易教程--Server端 ...
- 模拟Vue之数据驱动
一.前言 在随笔"模拟Vue之数据驱动1"结尾处,我们说到如果监听的属性是个对象呢?那么这个对象中的其他属性岂不就是监听不了了吗? 如下: 倘若user中的name.age属性变化 ...
- java中的重载与重写
重载简述 在java语言中,同一个类中的两个或者两个以上的方法可以有同一个名字,只要他们的的参数声明不同即可,该方法被称为重载,这个过程称为方法的重载,它是实现java多态性的一种方式. 重载是友好的 ...