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编码表:

  1. package com.sunchao.base64;
  2.  
  3. /**
  4. * Base64
  5. * @author Administrator
  6. *
  7. */
  8. public class Base64 {
  9. private static final byte[] CODE;
  10. private static final int[] BI;
  11.  
  12. static{
  13. CODE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  14. .getBytes();
  15. BI = new int['z' - '+' + 1];
  16. for(int i = 0; i < CODE.length; i++)
  17. BI[CODE[i] - 1] = i;
  18. }
  19.  
  20. private static final int indexOf(byte b){
  21. int index = b - '+';
  22. return BI[index];
  23. }
  24.  
  25. public static byte[] decode(byte[] base64){
  26. if(base64 == null)
  27. throw new NullPointerException();
  28.  
  29. if(base64.length < 4)
  30. throw new IllegalArgumentException("invalid base64 format!");
  31.  
  32. int left = 0,right = (base64.length >> 2) * 3;
  33. int len = right;
  34. if(base64[base64.length-2] == '='){
  35. len = right - 2;
  36. right = base64.length-3;
  37. }else if(base64[base64.length-1] == '='){
  38. len = right - 1;
  39. right = base64.length-3;
  40. }
  41. final byte[] result = new byte[len];
  42.  
  43. for(int i=left,j=0;i<right&&j<len;){
  44. int a = indexOf(base64[i++]);
  45. int b = indexOf(base64[i++]);
  46. int c = indexOf(base64[i++]);
  47. int d = indexOf(base64[i++]);
  48. byte aa = (byte)((a<<2)|((b>>4)&0xF));
  49. byte bb = (byte)(((b & 0xf)<<4)|((c>>2)&0x3F));
  50. byte cc = (byte)((c & 0x3)<<6 | d);
  51.  
  52. result[j++] = aa;
  53.  
  54. if(j >= len)
  55. break;
  56. result[j++] = bb;
  57. if(j >= len)
  58. break;
  59. result[j++] = cc;
  60. }
  61. return result;
  62. }
  63.  
  64. public static byte[] encode(byte[] data, int offset, int len){
  65. if(len == 0) return new byte[0];
  66. checkBounds(data.length, offset, len);
  67. int lp3 = len % 3;
  68. final byte[] result;
  69.  
  70. if(lp3 == 0)
  71. result = new byte[(len / 3) * 4];
  72. else
  73. result = new byte[(len + 3 - lp3) / 3 * 4];
  74.  
  75. int left = offset, right = offset + len - lp3, i = 0;
  76.  
  77. for(;left < right;){
  78. byte a = data[left++];
  79. byte b = data[left++];
  80. byte c = data[left++];
  81. i = encode(a, b, c, i, result);
  82. }
  83. if(lp3 >= 1){
  84. int a = data[left++];
  85. result[i++] = CODE[(a >> 2) & 0x3f];
  86. int b = left<data.length?data[left++]:0;
  87. int c = left<data.length?data[left++]:0;
  88. result[i++] = CODE[(a & 3)<<4 | ((b>>4)&0xf)];
  89. if(lp3 == 2)
  90. result[i++] = CODE[(b & 0xf)<<2 | ((c>>6)&0x3)];
  91. else
  92. result[i++] = '=';
  93. result[i] = '=';
  94. }
  95. return result;
  96. }
  97.  
  98. private static int encode(byte a, byte b, byte c, int i, byte[] result){
  99. result[i++] = CODE[(a >> 2) & 0x3f];
  100. result[i++] = CODE[(a & 3) << 4 | ((b>>4) & 0xf)];
  101. result[i++] = CODE[(b & 0xf) << 2 | ((c>>6) & 0x3)];
  102. result[i++] = CODE[c & 0x3f];
  103. return i;
  104. }
  105.  
  106. private static void checkBounds(int length, int offset, int charLen){
  107. if(offset < 0) throw new IllegalArgumentException("Negative offset : " + offset);
  108. if(offset > length) throw new IndexOutOfBoundsException("offset over the length : "
  109. + (offset - length));
  110. if(offset + charLen > length) throw new IndexOutOfBoundsException("offser + charLen - length : "
  111. + (offset + charLen - length));
  112. }
  113. }

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. 解决 react-router / react-router-dom v4 history不能访问的问题

    今天我把react-router 升级了一下, 在使用react-router-dom 是,子组件使用this.props.history 找不到了,看看官方文档,找了半天也没找到,因为我是在异步执行 ...

  2. java基础只关键字final

    final关键字简述 final关键字是在编写java程序中出现频率和很高的关键字,如果想要更好的编写java程序,那么掌握final关键字的运用是非常必要的.让我们先看一下final关键字可以修饰的 ...

  3. [js高手之路]寄生组合式继承的优势

    在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承: function Person( uName ){ this.skills = [ 'php', ...

  4. Ubuntu初始化MySQL碰到的坑

    想着将MySQL初始化,改变一下存放数据文件的位置: root@ubuntu:/lvmdata# mkdir data root@ubuntu:/lvmdata# chown -R mysql:mys ...

  5. 关于pocsuite的使用

    0x00 前言 pocsuite的用处就不多说了,早些时候也看到黑哥和余弦大佬在微博上说zoomeye 和pocsuite升级了. 结合最近自己在审计cms,也想收集一下其他cms的poc,比如chy ...

  6. 基于 socket.io 的 AI 服务 杂谈

    为什么会想到来聊下这个话题. 前几天在公司的项目中,开发一个基于 socket.io 的直播 IM 功能. 直播分为两部分,一部分是比较昂贵的 视频推流, 另外一部分是 IM 即时聊天服务. 从这里开 ...

  7. DirectSound---输出设备基本操作(枚举、查询等)

    DirectSound是DirectX组件之一,提供了对音频设备的捕获和播放能力,同时它也是唯一几个支持Xp系统的音频技术之一. DirectSound主要有以下特点: 优点: 播放音频低延迟. 硬件 ...

  8. 软件安装之-------VM虚拟机安装windows系统

    一 准备工作 1 电脑已经安装上VMware Workstation 2 一个Windows系统,下载纯净版系统可到(www.itellyou.cn下载) 3  软碟通 下载可到(http://dow ...

  9. SSIS 延迟验证(DelayValidation)

    验证是一个事件,该事件在Package执行时,第一个被触发,验证能够避免SSIS引擎执行一个有异常的Package或Task.延迟验证(DelayValidation)是把验证操作延迟到Package ...

  10. 浴室沉思:聊聊DAL和Repository

    这是一个由DDD群引发的随笔 在写了上一篇随笔<关于ORM的浴室沉思>后一些朋友私聊我,很多刚接触DDD的朋友会对Repository(仓储层)这东西有点疑惑,为什么要叫仓储层?是不是三层 ...