Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
规则
关于这个编码的规则:
①把3个字节变成4个字节。
②每76个字符加一个换行符。
③最后的结束符也要处理。
例子:

转换前 11111111, 11111111, 11111111 (二进制)
转换后 00111111, 00111111, 00111111, 00111111 (二进制)
把三个分割成4个。
上面的三个字节是原文,下面的四个字节是转换后的Base64编码格式。
转换后,我们用一个码表来得到我们想要的字符串(也就是最终的Base64编码)这个表是这样的:(摘自RFC2045)
转换表

如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:

先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。

在编码后的Base64文本后加上一个或两个=号,代表补足的字节数。

也就是说:
当最后剩余两个八位(待补足)字节(2个byte)时,最后一个6位的Base64字节块有四位是0值,最后附加上两个等号;
如果最后剩余一个八位(待补足)字节(1个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。

参考下表:

编码过程代码:

static char[] base64_list = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P','Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f','g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v','w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};public static void main(String[] args) {base64_("百度百科");}public static char base64_list(int num) {return base64_list[num];}public static void base64_(String a) {String str = "";byte[] bytes = a.getBytes();//转化为字节数组int yCount = bytes.length % 3;for (int i = 0; i < bytes.length - yCount; i = i + 3) {int v = ((bytes[i] & 0XFF) << 16) | ((bytes[i + 1] & 0XFF) << 8) | (bytes[i + 2] & 0XFF);//隐式转换 byte进行位运算后自动转换成intint o1 = v >>> 18 & 0x3F;//共24位 右移18位 余6位 取0x3F=6位数int o2 = v >>> 12 & 0x3F;int o3 = v >>> 6 & 0x3F;int o4 = v & 0x3F;str = str + base64_list(o1) + base64_list(o2) + base64_list(o3) + base64_list(o4);}if (yCount == 1) {//余数为1的情况byte b = bytes[bytes.length - 1];str += base64_list((b & 0xFF) >>> 2);str += base64_list((b & 0xFF )<< 4 & 0x3F);str += "==";} else if (yCount == 2) {//余数为2的情况int aa = ((bytes[bytes.length - 2] & 0xFF) << 8) | (bytes[bytes.length - 1] & 0xFF);int a1 = aa >>> 10 & 0x3F;//余6位int a2 = aa >>> 4 & 0x3F;//余12位int a3 = aa << 2 & 0x3F;//余18位 取6位str +=  base64_list(a1) + base64_list(a2)+ base64_list(a3);str += "=";}System.out.println(str);}

解码过程代码:

 public static void main(String[] args) {Base64__01("55m+5bqm55m+56eR");}static char[] base64_list = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P','Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f','g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v','w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};public static void Base64__01(String str) {String str1 = str.split("=")[0];//截取等号前面的字符char[] chars = str1.toCharArray();//转换成char数组int[] ints2 = new int[chars.length];String base_list01 = String.valueOf(base64_list);//把上面的字符数组转换成字符串for (int i = 0; i < chars.length; i++) {ints2[i] = base_list01.indexOf(chars[i]);//查找位置 得到的位数存入数组}byte[] bytes = new byte[ints2.length/4*3];int count = 0;for (int i = 0; i < ints2.length; i = i + 4) {int v = ((ints2[i]) << 18) | ((ints2[i + 1]) << 12) | ((ints2[i + 2]) << 6) | (ints2[i + 3]);int o1 = v >>> 16 & 0xFF;//右移16位 取8位int o2 = v >>> 8 & 0xFF;int o3 = v & 0xFF;bytes[count] = (byte) o1;//存入byte数组bytes[count + 1] = (byte) o2;bytes[count + 2] = (byte) o3;count = count + 3;}System.out.println(new String(bytes));}

Base64的编码以及解码相关推荐

  1. php base64解码,PHP Base64 中英文编码 JavaScript 解码

    最新PHP Base64 中英文编码 JavaScript 解码 以下是三零网为大家整理的最新PHP Base64 中英文编码 JavaScript 解码的文章,希望大家能够喜欢! function ...

  2. javascript中的Base64.UTF8编码与解码详解

    javascript中的Base64.UTF8编码与解码详解 本文给大家介绍的是javascript中的Base64.UTF8编码与解码的函数源码分享以及使用范例,十分实用,推荐给小伙伴们,希望大家能 ...

  3. 彻底弄懂base64的编码与解码原理

    作者介绍 背景 base64的编码原理网上讲解较多,但解码原理讲解较少,并且没有对其中的内部实现原理进行剖析.想要彻底了解base64的编码与解码原理,请耐心看完此文,你一定会有所收获. 涉及算法与逻 ...

  4. img图片的预览和下载(iframe基本使用),图片转file格式,file文件转base64格式,base64的编码和解码

    目录 一.根据后端接口返回的URL下载和预览图片 1.调用下载图片函数实现下载图片 2.弹出另一个页面,实现预览图片. 3.不弹出另一个页面,实现下载/预览图片(iframe方式) 4.动态创建ifr ...

  5. atob()和btoa() 进行base64的编码和解码

    编码: 解码:

  6. btoa java_javascript atob()函数和 btoa()函数-Base64的编码与解码-Go语言中文社区

    在 JavaScript 中,有两个函数被分别用来处理解码和编码 base64 字符串: atob() //ASCII to Base64 btoa() //Base64 to ASCII atob( ...

  7. javascript atob()函数和 btoa()函数-Base64的编码与解码

    在 JavaScript 中,有两个函数被分别用来处理解码和编码 base64 字符串: atob() //ASCII to Base64 btoa() //Base64 to ASCII atob( ...

  8. js中使用btoa和atob进行Base64的编码和解码

    window.atob(string):解码 用来解码一个已经被base-64编码过的字符串.(参数string: 必需是一个通过 btoa() 方法编码的字符串) window.btoa(strin ...

  9. Base64的编码和解码

    为什么要使用Base64? 在设计这个编码的时候,我想设计人员最主要考虑了3个问题: 1.是否加密? 2.加密算法复杂程度和效率 3.如何处理传输? 加密是肯定的,但是加密的目的不是让用户发送非常安全 ...

  10. C# Base64图片编码和解码

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RFC2049,上面有MIME的详细规范. Ba ...

最新文章

  1. Jquery中使用select2插件实现ajax实时请求数据
  2. C# 实现一个可取消的多线程操作 示例
  3. 两个对象数组交集_yiduobo的每日leetcode 349.两个数组的交集 amp;amp; 350.两个数组的交集II...
  4. java 本年第一天_JAVA获取本周 本月 本年 第一天和最后一天
  5. java实现冗余校验_循环冗余校验_循环冗余校验码计算_循环冗余校验 java实现(6)...
  6. 求邻接矩阵matlab,如何使用MATLAB绘制邻接矩阵
  7. 无线ac管理服务器调试方法,AC功能管理无线AP设置步骤
  8. 限流 Redis list 列表 Lpush rpop 实现令牌桶 – PHP 实例
  9. 清除www.2345.com修改首页的方法
  10. 关于使用媒体查询@meda失效原因的总结或注意事项
  11. “一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,
  12. 一文读懂大数据两大核心技术
  13. 理解线性代数,矩阵运算,行列式
  14. war包安装jenkins时报错
  15. 链路聚合的原理以及配置
  16. 连锁定位(Linkage Mapping)与关联定位(Association Mapping)
  17. 第1章 沉沦在大学里——《逆袭大学》连载
  18. java .vm_java VM
  19. 鲁大师8月新机流畅榜:小米MIUI 12增强版又行了?
  20. (转)活出自己的生命

热门文章

  1. 百度关键词指数查询易语言代码
  2. android高德地图自定义地图,Android集成高德地图如何自定义marker
  3. 去掉百度地图API左下角的百度LOGO方法
  4. linux 回收站目录,探索linux系统回收站与U盘中的.Trash文件夹区别之处
  5. 【Android,Kotlin】自定义弹框的简单写法Demo
  6. 计算机如何调整对比度,怎么调整电脑显示器亮度和对比度
  7. 计算机网络 --- HTTP协议 和 HTTPS
  8. Win32反汇编(一) 初步探索Win32反汇编 与 Ollydbg的简单使用
  9. 模拟退火(SA)算法实例介绍(JAVA)
  10. python绘制太阳花_Python绘制蟒蛇和太阳花