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 ...
随机推荐
- 解决 react-router / react-router-dom v4 history不能访问的问题
今天我把react-router 升级了一下, 在使用react-router-dom 是,子组件使用this.props.history 找不到了,看看官方文档,找了半天也没找到,因为我是在异步执行 ...
- java基础只关键字final
final关键字简述 final关键字是在编写java程序中出现频率和很高的关键字,如果想要更好的编写java程序,那么掌握final关键字的运用是非常必要的.让我们先看一下final关键字可以修饰的 ...
- [js高手之路]寄生组合式继承的优势
在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承: function Person( uName ){ this.skills = [ 'php', ...
- Ubuntu初始化MySQL碰到的坑
想着将MySQL初始化,改变一下存放数据文件的位置: root@ubuntu:/lvmdata# mkdir data root@ubuntu:/lvmdata# chown -R mysql:mys ...
- 关于pocsuite的使用
0x00 前言 pocsuite的用处就不多说了,早些时候也看到黑哥和余弦大佬在微博上说zoomeye 和pocsuite升级了. 结合最近自己在审计cms,也想收集一下其他cms的poc,比如chy ...
- 基于 socket.io 的 AI 服务 杂谈
为什么会想到来聊下这个话题. 前几天在公司的项目中,开发一个基于 socket.io 的直播 IM 功能. 直播分为两部分,一部分是比较昂贵的 视频推流, 另外一部分是 IM 即时聊天服务. 从这里开 ...
- DirectSound---输出设备基本操作(枚举、查询等)
DirectSound是DirectX组件之一,提供了对音频设备的捕获和播放能力,同时它也是唯一几个支持Xp系统的音频技术之一. DirectSound主要有以下特点: 优点: 播放音频低延迟. 硬件 ...
- 软件安装之-------VM虚拟机安装windows系统
一 准备工作 1 电脑已经安装上VMware Workstation 2 一个Windows系统,下载纯净版系统可到(www.itellyou.cn下载) 3 软碟通 下载可到(http://dow ...
- SSIS 延迟验证(DelayValidation)
验证是一个事件,该事件在Package执行时,第一个被触发,验证能够避免SSIS引擎执行一个有异常的Package或Task.延迟验证(DelayValidation)是把验证操作延迟到Package ...
- 浴室沉思:聊聊DAL和Repository
这是一个由DDD群引发的随笔 在写了上一篇随笔<关于ORM的浴室沉思>后一些朋友私聊我,很多刚接触DDD的朋友会对Repository(仓储层)这东西有点疑惑,为什么要叫仓储层?是不是三层 ...