一.Base64编码原理Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,其编码原理如下:

1. 统计需要编辑的字符串长度,把需要编译的字符串按每3个为一组,长度整除3的在字符串后面加0补全,最终把字符串分为若干组

2. 编码时以组为单位,组中的字符串转为ASCII编码,得到3个ASCII编码数字,再把3个ASCII编码数字转为8bit字节的二进制,一共得到24个字节

3. 再把24个字节分为4组,每组为6bit字节的二进制,把每一组的二进制转为十进制

4. 根据Base64编码表对数据进行编码,得到Base64编码。Base64编码表如下

Base64 编码表
Value Char   Value Char   Value Char   Value Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

Base64编码举例:

a)字符串(bat),长度为3,能够被3整除,base64编码后结果为:YmF0;其编码过程如下:

原始字符 b a t  
ASCII:  62 61 74  
8bit字节: 01100010 01100001 01110100  
6bit字节: 011000 100110 000101 110100
十进制:    24 38 5 52
对应编码:   Y m F 0

b)字符串(eakom),长度为5,不能被3整除,编码是需要在后面补0,base64编码后结果为:ZWFrb20=;其编码过程如下:

原始字符 e a k   o m    
ASCII:  101 97 107   111 109    
8bit字节: 1100101 01100001 01101011   01101111 01101101 00000000  
6bit字节: 11001 010110 000101 101011 011011 110110 110100 000000
十进制:    25 22 5 43 27 54 52 0
对应编码:   Z W F r b 2 0 =

编码说明:把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。
二、base64运用场景

a)用于URL中,迅雷下载和百度云盘分析的URL链接大部分使用Base64编译

b)嵌入Css文件中直接显示图片

#fkbx-spch, #fkbx-hspch {background: url(data:image/gif;base64,R0lGODlhHAAmAKIHAKqqqsvLy0hISObm5vf394uLiwAAAP///yH5B…EoqQqJKAIBaQOVKHAXr3t7txgBjboSvB8EpLoFZywOAo3LFE5lYs/QW9LT1TRk1V7S2xYJADs=) no-repeat center;
}

c)HTML中嵌入base64编码,浏览器解析Base64编码显示图片

<img src="data:image/gif;base64,R0lGODlhHAAmAKIHAKqqqsvLy0hISObm5vf394uLiwAAAP///yH5B…EoqQqJKAIBaQOVKHAXr3t7txgBjboSvB8EpLoFZywOAo3LFE5lYs/QW9LT1TRk1V7S2xYJADs=">

三、Java常用的Base64编码转换

package com.eakom.common.util;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;import org.slf4j.LoggerFactory;
import org.bouncycastle.util.encoders.UrlBase64;import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/*** Base二进制文件处理类* @author eakom* @date 2017年5月26日*/
public class Base64Utils {private Base64Utils(){}private static final Logger logger=LoggerFactory.getLogger(Base64Utils.class );public final static String ENCODING="UTF-8"; /*** base64转字符串* * @param str* @return* @throws UnsupportedEncodingException*/public static String Base642String(String str) throws UnsupportedEncodingException {byte[] bytes = Base64.decodeBase64(str.getBytes());return new String(bytes);}/*** 字符串转base64编码* * @param str* @return* @throws UnsupportedEncodingException*/public static String String2Base64(String str) throws UnsupportedEncodingException {byte[] bytes = Base64.encodeBase64(str.getBytes());return new String(bytes);}/*** 将string类型的数据转码为byte类型.* * @param fileData*            String 类型的数据.* @return 转码后的数据byte类型,发生异常或者filedate为null或者“”时返回空byte[0].*/public static byte[] String2byte(String fileData) {if (fileData != null&&!"".equals(fileData)) {BASE64Decoder decoder = new BASE64Decoder();try {return decoder.decodeBuffer(fileData);} catch (IOException e) {logger.error("String2byte出错", e);}}return new byte[0];}/*** 将byte类型的数据经过base64编码转为string.* @param fileData*            byte类型的数据 .* @return 转码后的数据,发生异常或者filedate为null时返回空"".*/public static String byte2String(byte[] fileData) {if (fileData != null) {BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(fileData).replaceAll("\\s*","");}return "";}/*** 将对象编码为base64的String.* * @param object*            要进行编码的对象.* @return 编码后的对象对应的bease64String.*/public static String Object2Base64(Object object) {String objectString = null;ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();try {ObjectOutputStream objectOutputStream = new ObjectOutputStream(arrayOutputStream);objectOutputStream.writeObject(object);objectString = byte2String(arrayOutputStream.toByteArray());} catch (IOException e) {logger.error("Object2Base64出错", e);}return objectString;}/*** 将bease64的String解编码为对象;* * @param objectString*            可以解编码为Object的Base64String,如果不能解编码为Object抛出异常.* @return 解编码成功后的对象.*/public static Object Base642Object(String objectString) {Object object = null;ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(String2byte(objectString));try {ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);object = objectInputStream.readObject();} catch (IOException e) {logger.error("Base642Object", e);} catch (ClassNotFoundException e) {logger.error("Object2Base64路径错误出错", e);}return object;}/*** 将InputStream类型的数据转码为String.* * @param fileData*            InputStream类型的数据.* @return 转码后的数据String类型,发生异常或者filedate为null时返回null.*/public static String InputStream2String(InputStream fileData) {if (fileData == null) {return null;}BASE64Encoder encoder = new BASE64Encoder();byte[] _fileData;try {_fileData = new byte[fileData.available()];fileData.read(_fileData);fileData.close();return encoder.encode(_fileData).replaceAll("\\s*","");} catch (IOException e) {logger.error("InputStream2String出错", e);}return null;}/*** Base64转InputStream* @param data * @return*/public static InputStream Base642InputStream(String base64){BASE64Decoder decoder = new BASE64Decoder();InputStream is=null;try {// 解密byte[] b = decoder.decodeBuffer(base64);// 处理数据for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {b[i] += 256;}}is = new ByteArrayInputStream(b); }catch(IOException e){logger.error("Base642InputStream", e);}return is;}/*** 加密* @param data* @return* @throws UnsupportedEncodingException*/public static String encoded(String data) throws UnsupportedEncodingException{byte[] b=UrlBase64.encode(data.getBytes(ENCODING));return new String(b,ENCODING);}/*** 解密* @param data* @return* @throws UnsupportedEncodingException*/public static String decode(String data) throws UnsupportedEncodingException{byte[] b=UrlBase64.decode(data.getBytes(ENCODING));return new String(b,ENCODING);}/*** @Description: 将base64编码字符串转换为图片* @Author: * @CreateTime: * @param imgStr base64编码字符串* @param path 图片路径-具体到文件* @return*/public static boolean Base642Image(String imgStr, String path) {if (imgStr == null){        return false;}BASE64Decoder decoder = new BASE64Decoder();try {// 解密byte[] b = decoder.decodeBuffer(imgStr);// 处理数据for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {b[i] += 256;}}OutputStream out = new FileOutputStream(path);out.write(b);out.flush();out.close();return true;} catch (Exception e) {logger.error("Base642Image异常", e);return false;}}/*** @Description: 根据图片地址转换为base64编码字符串* @Author: * @CreateTime: * @return*/public static String Image2Base64(String imgFile) {InputStream inputStream = null;byte[] data = null;try {inputStream = new FileInputStream(imgFile);data = new byte[inputStream.available()];inputStream.read(data);inputStream.close();} catch (IOException e) {logger.error("Image2Base64出错", e);}// 加密BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(data);}public static void main(String[] args) throws UnsupportedEncodingException {String image2String = Image2Base64("D:/二维码-1497779927202.png");String imgStr="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";String path="D:/1234125.jpg";Base642Image(imgStr, path);System.out.println(image2String);}
}

四、base64编码后文件大小比之前的文件大了1/4,不利于保存;嵌入css中的base64编码图片会增加浏览器渲染的压力,因此只适合嵌入一些小图片,不适合把大图片嵌入其中。Base64主要在一些特殊情况下处理图片或PDF文件,其他地方慎重使用。

Base64 编码表
Value Char   Value Char   Value Char   Value Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

开发中Base64编码运用相关推荐

  1. Javascript中Base64编码解码的使用实例

    Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 1 var encodedStr = win ...

  2. Vue中base64编码和解码

    推荐一个不错的学习资料库 Vue中base64编码和解码 1.在项目更目录下执行命令,安装 npm install --save js-base64 2.在使用的项目引入 let Base64 = r ...

  3. Python和shell中Base64编码使用那些事

    做开发第一个接触的编码方式就是Base64,当时是用url来传输一些参数,传输的两端会用Base64来编码和解码,保证数据不被url转义破坏. 下面是 维基百科 Base64 中的介绍,其实自己实现起 ...

  4. Java中BASE64 编码

    2019独角兽企业重金招聘Python工程师标准>>> BASE64 编码是一种常用的字符编码,在很多地方都会用到.JDK 中提供了非常方便的 BASE64Encoder 和 BAS ...

  5. golang中base64编码_MySQL中如何将字符串转为base64编码?

    点击蓝字关注我们!每天获取最新的编程小知识! 源 / php中文网      源 / www.php.cn 在MySQL中,TO_BASE64()函数将字符串转换为以base-64编码的字符串并返回结 ...

  6. golang中base64编码_golang中自带base64编码和解码

    golang中base64的编码和解码可以用内置库encoding/base64 package main import ( "encoding/base64" "fmt ...

  7. 使用MyEclipse开发中的编码设置

    在使用Eclipse+MyEclipse开发中,许多文件编码默认是ISO-8859-1,不支持中文(如常用的JSP).这样我们每次建文件都要手动改编码,其实我们可以在设置文件默认编码,今后再创建时就不 ...

  8. java中base64编码加密和android中base64编码加密不一样?base64编码解析错误?

    在android的base64加密后得到: WwogIHsKICAgICJ0MSI6ICIwIiwKICAgICJ0MiI6ICIyNDM4NCIsCiAgICAidDMiOiAiIiwKICAgIC ...

  9. golang中base64编码_golang中base64编码和解码

    golang中base64的编码和解码可以用内置库encoding/base64 package main import ( "encoding/base64" "fmt ...

最新文章

  1. 微软将发布5月安全漏洞补丁 修补PPT
  2. 《从零开始学Swift》学习笔记(Day 7)——Swift 2.0中的print函数几种重载形式
  3. 计算机硬盘位显示none,开机找不到硬盘Detecting Primary Master... None
  4. To B设计系统 - 在平平淡淡中开花结果
  5. C++强制类型转换操作符 dynamic_cast
  6. CF1415E New Game Plus(贪心)
  7. heartbeat与keepalived对比
  8. html 头尾代码自动,HTML Head Generator - 纯 CSS 实现的头部元标签代码生成器 - 钉子の次元...
  9. rabbitmq中的队列transient和durable的区别
  10. 这辈子最难忘的一顿饭是什么?
  11. html+css实现小米商城
  12. 新闻文化建设杂志新闻文化建设杂志社新闻文化建设编辑部2022年第14期目录
  13. 成立一年超100家客户,卫瓴科技如何用“客户成功”驱动SaaS企业内外增长? | CEO面对面
  14. 删除重复记录并修改索引
  15. 计算二维紧束缚模型费米面和nesting程序新思路
  16. VSPD虚拟串口工具实用工具--小白入门篇
  17. 一个计算器的C语言实现
  18. web项目使用maven打jar包方式
  19. 基于AM57x的GigE工业相机图像采集案例TL5728-IDK开发板
  20. Linux下stardic和goldendict等词典的词库下载

热门文章

  1. python情感词典计算得分_用python进行金融市场文本数据的情感计算!
  2. unity-导航系统
  3. 啊哈C——学习2.8一起来找茬
  4. 2017年7月编程语言排行榜
  5. 可视化智能预警为生产运行保驾护航
  6. 双等位基因(biallelic sites )和多等位基因(multiallelic sites)
  7. 动车组检修问题 数学建模
  8. P2471 [SCOI2007]降雨量(线段树)
  9. Ubuntu 16.04通过命令行连接Wi-Fi
  10. http的了解、get/post的区别