佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Base64 編碼介紹、Base64編碼轉(zhuǎn)換原理與算法

Base64 編碼介紹、Base64編碼轉(zhuǎn)換原理與算法

熱門標(biāo)簽:服務(wù)器配置 鐵路電話系統(tǒng) 檢查注冊表項 美圖手機(jī) 網(wǎng)站文章發(fā)布 智能手機(jī) 呼叫中心市場需求 銀行業(yè)務(wù)

Base64編碼,是我們程序開發(fā)中經(jīng)常使用到的編碼方法。它是一種基于用64個可打印字符來表示二進(jìn)制數(shù)據(jù)的表示方法。它通常用作存儲、傳輸一些二進(jìn)制數(shù)據(jù)編碼方法!也是MIME(多用途互聯(lián)網(wǎng)郵件擴(kuò)展,主要用作電子郵件標(biāo)準(zhǔn))中一種可打印字符表示二進(jìn)制數(shù)據(jù)的常見編碼方法!它其實只是定義用可打印字符傳輸內(nèi)容一種方法,并不會產(chǎn)生新的字符集!有時候,我們學(xué)習(xí)轉(zhuǎn)換的思路后,我們其實也可以結(jié)合自己的實際需要,構(gòu)造一些自己接口定義編碼方式。好了,我們一起看看,它的轉(zhuǎn)換思路吧!

Base64實現(xiàn)轉(zhuǎn)換原理

它是用64個可打印字符表示二進(jìn)制所有數(shù)據(jù)方法。由于2的6次方等于64,所以可以用每6個位元為一個單元,對應(yīng)某個可打印字符。我們知道三個字節(jié)有24個位元,就可以剛好對應(yīng)于4個Base64單元,即3個字節(jié)需要用4個Base64的可打印字符來表示。在Base64中的可打印字符包括字母A-Z、a-z、數(shù)字0-9 ,這樣共有62個字符,此外兩個可打印符號在不同的系統(tǒng)中一般有所不同。但是,我們經(jīng)常所說的Base64另外2個字符是:“+/”。這64個字符,所對應(yīng)表如下。

編號 字符 編號 字符 編號 字符 編號 字符
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編碼轉(zhuǎn)換算法、轉(zhuǎn)換原理

轉(zhuǎn)換的時候,將三個byte的數(shù)據(jù),先后放入一個24bit的緩沖區(qū)中,先來的byte占高位。數(shù)據(jù)不足3byte的話,于緩沖區(qū)中剩下的bit用0補(bǔ)足。然后,每次取出6個bit,按照其值選擇
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作為編碼后的輸出。不斷進(jìn)行,直到全部輸入數(shù)據(jù)轉(zhuǎn)換完成。

如果最后剩下兩個輸入數(shù)據(jù),在編碼結(jié)果后加1個“=”;如果最后剩下一個輸入數(shù)據(jù),編碼結(jié)果后加2個“=”;如果沒有剩下任何數(shù)據(jù),就什么都不要加,這樣才可以保證資料還原的正確性。

編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長,為原來的4/3。無論什么樣的字符都會全部被編碼,因此不像Quoted-printable 編碼,還保留部分可打印字符。所以,它的可讀性不如Quoted-printable 編碼!

文本 M a n
ASCII編碼 77 97 110
二進(jìn)制位 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
索引 19 22 5 46
Base64編碼 T W F u

M的Ascii碼是77,前六位對應(yīng)值為19,對應(yīng)base64字符是T,如此類推。其它字符編碼就可以自動轉(zhuǎn)換得到!我們看看另外不是剛好是3個字節(jié)的情況!

文本(1 Byte) A
二進(jìn)制位 0 1 0 0 0 0 0 1
二進(jìn)制位(補(bǔ)0) 0 1 0 0 0 0 0 1 0 0 0 0
Base64編碼 Q Q = =
文本(2 Byte) B C
二進(jìn)制位 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 x x x x x x
二進(jìn)制位(補(bǔ)0) 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 x x x x x x
Base64編碼 Q k M =

Base64轉(zhuǎn)換代碼實現(xiàn)

既然知道了方法,那么我們?nèi)绻约簩憘€簡單轉(zhuǎn)換,好像也是很容易的!下面,我寫下我做轉(zhuǎn)換php代碼!

/**
 *base64編碼方法、本方法只是做base64轉(zhuǎn)換過程代碼舉例說明,通過該例子可以任意改造不同語言版
 *@author 程默
 *@copyright http://blog.chacuo.net
 *@param $src 原字符串
 *@return string base64字符串*
 */
function c_base64_encode($src)
{
	static $base="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	
	////將原始的3個字節(jié)轉(zhuǎn)換為4個字節(jié)
	$slen=strlen($src);
	$smod = ($slen%3);
	$snum = floor($slen/3);
	
	
	$desc = array();
	
	for($i=0;$i$snum;$i++)
	{
		////讀取3個字節(jié)
		$_arr = array_map('ord',str_split(substr($src,$i*3,3)));
		
		///計算每一個base64值
		$_dec0= $_arr[0]>>2;
		$_dec1= (($_arr[0]3)4)|($_arr[1]>>4);
		$_dec2= (($_arr[1]0xF)2)|($_arr[2]>>6);	
		$_dec3= $_arr[2]63;

		$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$base[$_dec2],$base[$_dec3]));
	}
	
	if($smod==0) return implode('',$desc);
	
	///計算非3倍數(shù)字節(jié)
	$_arr = array_map('ord',str_split(substr($src,$snum*3,3)));
	$_dec0= $_arr[0]>>2;
	///只有一個字節(jié)
	if(!isset($_arr[1]))
	{
		$_dec1= (($_arr[0]3)4);
		$_dec2=$_dec3="=";
	}
	else 
	{
		///2個字節(jié)
		$_dec1= (($_arr[0]3)4)|($_arr[1]>>4);
		$_dec2= $base[($_arr[1]7)2];
		$_dec3="=";
	}
	$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$_dec2,$_dec3));
	return implode('',$desc);
}

好了,通過這個例子,我想base64編碼轉(zhuǎn)換原理、算法有些了解了吧!它轉(zhuǎn)換過程很簡單,只需要做個映射表,然后將原先做一些移位運算就可以完成!我們通過該例子,是不是可以做個自己的base32這類的編碼呢!歡迎朋友們交流!

您可能感興趣的文章:
  • c++ base64編解碼使用示例
  • python3 常見解密加密算法實例分析【base64、MD5等】
  • Java Base64算法實際應(yīng)用之郵件發(fā)送實例分析
  • JS實現(xiàn)的3des+base64加密解密算法完整示例
  • Java實現(xiàn)的Base64加密算法示例
  • JavaScript BASE64算法實現(xiàn)(完美解決中文亂碼)
  • Android數(shù)據(jù)加密之Base64編碼算法的簡單實現(xiàn)
  • java實現(xiàn)Base64加密解密算法
  • Android編程加密算法小結(jié)(AES、Base64、RAS加密算法)
  • c++如何實現(xiàn)Base64算法

標(biāo)簽:上海 沈陽 長治 樂山 滄州 河南 新疆 紅河

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Base64 編碼介紹、Base64編碼轉(zhuǎn)換原理與算法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    新田县| 板桥市| 玉林市| 元江| 松原市| 株洲县| 雅江县| 繁昌县| 盐池县| 林芝县| 恩施市| 清河县| 临沧市| 光山县| 夏河县| 当涂县| 绿春县| 阿城市| 梅河口市| 天全县| 盱眙县| 晋江市| 林州市| 洛浦县| 和政县| 通州区| 台中县| 广南县| 专栏| 陇南市| 泸水县| 新蔡县| 通山县| 隆林| 改则县| 德阳市| 怀远县| 疏附县| 白城市| 南京市| 南靖县|