Base64算法

Base64算法的前世,據說在早期的電子郵件傳輸的過程中,僅僅支持ASCII碼的傳輸,如果一些非ASCII碼也通過電子郵件進行傳輸,那麼通過網關的時候,會在高位補0,從而接收方會收到一堆亂碼,爲了解決這個問題,Base64應運而生,現在base64廣泛應用於對瀏覽器地址欄url的編碼、避免靜態圖片資源重複通過http請求訪問服務器下載圖片而直接將圖片轉爲base64放在html頁面上和簡單的加解密等方面。

顧名思義,Base64,基於64個字符的編碼算法,如下圖。


這64個字符分別是大寫A-Z,小寫a-z,0-9以及+、/、=組成的,其中“=”是用來進行補位的。

Base64的實現原理,主要需要進行以下六步操作:

1.將給定字符串每個字符轉換爲ASCII碼對應的字符編碼。

2.將字符編碼轉換爲對應的二進制碼。

3.分組操作,3個8位二進制碼(3個字節)轉換爲4個6位二進制碼,如果轉換後不足6位的那麼在後面進行補0填充。

4.在4個6位二進制碼的高位,也就是左側,添加2位0進行補位。

5.將此時的4個8位二進制碼(4個字節)轉化爲對應的十進制碼。

6.查字典,找到該十進制碼對應Base64表中對應的字符。

從上面的原理我們可以清楚的看到,Base64轉化的過程其實就是分組、補位的一個過程,每一組由起初的3個字節變成分組後的4個字節,數據長度增加了4/3,字符串字符都是以4爲單位的整數倍。

平時我們一般使用apache的codec來進行base64的編解碼,以後我們還會使用到codec來進行md5、sha等信息摘要的處理。

codec的maven依賴(目前最新的是1.10版本):

<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>

package com.liuqiang.base64;

import java.io.UnsupportedEncodingException;

import org.apache.commons.codec.binary.Base64;

public class Base64Coder {
	
	private static final String ENCODING = "utf-8";
	/**
	 * 
	 * @param data
	 * @return
	 * @throws UnsupportedEncodingException
	 
	 *********       ***       *********   *********   *********   *     *
	 *        *     *   *      *           *           *           *     *
	 *********     *******     *********   *********   *********   *********
	 *        *   *       *            *   *           *       *         *
	 *********   *         *   *********   *********   *********         *
	 
	 * binaryData - Array containing binary data to encode.
	 * isChunked - if true this encoder will chunk the base64 output into 76 character blocks /r/n
	 * urlSafe - if true this encoder will emit - and _ instead of the usual + and / characters. Note: no padding is added when encoding using the URL-safe alphabet.
	 * maxResultSize - The maximum result size to accept.
	 */
	public static String base64Encoder(String data) throws UnsupportedEncodingException{	

		byte [] binaryData = data.getBytes(ENCODING);
		
		//chunked、urlsafe、maxResultSize均默認false
		Base64.encodeBase64(binaryData);
		
		//chunked可設置,urlsafe、maxResultSize默認false
		Base64.encodeBase64(binaryData, true);
		
		//chunked、urlsafe可設置,maxResultSize默認false
		Base64.encodeBase64(binaryData, true, true);
		
		//chunked、urlsafe、maxResultSize均可設置
		Base64.encodeBase64(binaryData, true, true, 60);
		
		//默認chunked爲true
		Base64.encodeBase64Chunked(binaryData);
		
		//默認urlSafe爲true
		Base64.encodeBase64URLSafe(binaryData);
		
		//默認urlSare爲true,返回字符串
		Base64.encodeBase64URLSafeString(binaryData);
		
		//chunked、urlsafe、maxResultSize均默認false,返回字符串
		return Base64.encodeBase64String(binaryData);
		
	}
	
	public static String base64Decoder(String data) throws UnsupportedEncodingException{
		byte [] binaryData = data.getBytes(ENCODING);
		//接收字符串
		Base64.decodeBase64(data);
		//pArray - a byte array containing base64 character data
		Base64.decodeInteger(binaryData);
		//接字節數收組
		return new String(Base64.decodeBase64(binaryData),ENCODING);
	}
	
	public static void main(String[] args) {
		String data = "base64";
		try {
			String encode = base64Encoder(data);
			String decode = base64Decoder(encode);
			System.out.println(encode);
			System.out.println(decode);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
}</span>

運行結果:

YmFzZTY0
base64

上面代碼展示了codec對於base64的封裝的全部API,用法十分簡單,方法見名知意,具體參數含義可以參看註釋,平時我們如果需要轉換,也可以使用在線工具進行base64的轉換,十分方便。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章