开发中Base64编码运用

一.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
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

Base64编码举例:

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

原始字符bat 
ASCII: 626174 
8bit字节:011000100110000101110100 
6bit字节:011000100110000101110100
十进制:   2438552
对应编码:  YmF0


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

原始字符eak om  
ASCII: 10197107 111109  
8bit字节:11001010110000101101011 011011110110110100000000 
6bit字节:11001010110000101101011011011110110110100000000
十进制:   25225432754520
对应编码:  ZWFrb20=

编码说明:把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
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值