編號 | 字符 | 編號 | 字符 | 編號 | 字符 | 編號 | 字符 | |||
---|---|---|---|---|---|---|---|---|---|---|
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)換的時(shí)候,將三個(gè)byte的數(shù)據(jù),先后放入一個(gè)24bit的緩沖區(qū)中,先來的byte占高位。數(shù)據(jù)不足3byte的話,于緩沖區(qū)中剩下的bit用0補(bǔ)足。然后,每次取出6個(gè)bit,按照其值選擇
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作為編碼后的輸出。不斷進(jìn)行,直到全部輸入數(shù)據(jù)轉(zhuǎn)換完成。
如果最后剩下兩個(gè)輸入數(shù)據(jù),在編碼結(jié)果后加1個(gè)“=”;如果最后剩下一個(gè)輸入數(shù)據(jù),編碼結(jié)果后加2個(gè)“=”;如果沒有剩下任何數(shù)據(jù),就什么都不要加,這樣才可以保證資料還原的正確性。
編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長,為原來的4/3。無論什么樣的字符都會(huì)全部被編碼,因此不像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,如此類推。其它字符編碼就可以自動(dòng)轉(zhuǎn)換得到!我們看看另外不是剛好是3個(gè)字節(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)換代碼實(shí)現(xiàn)
既然知道了方法,那么我們?nèi)绻约簩憘€(gè)簡單轉(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個(gè)字節(jié)轉(zhuǎn)換為4個(gè)字節(jié) $slen=strlen($src); $smod = ($slen%3); $snum = floor($slen/3); $desc = array(); for($i=0;$i$snum;$i++) { ////讀取3個(gè)字節(jié) $_arr = array_map('ord',str_split(substr($src,$i*3,3))); ///計(jì)算每一個(gè)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); ///計(jì)算非3倍數(shù)字節(jié) $_arr = array_map('ord',str_split(substr($src,$snum*3,3))); $_dec0= $_arr[0]>>2; ///只有一個(gè)字節(jié) if(!isset($_arr[1])) { $_dec1= (($_arr[0]3)4); $_dec2=$_dec3="="; } else { ///2個(gè)字節(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); }
好了,通過這個(gè)例子,我想base64編碼轉(zhuǎn)換原理、算法有些了解了吧!它轉(zhuǎn)換過程很簡單,只需要做個(gè)映射表,然后將原先做一些移位運(yùn)算就可以完成!我們通過該例子,是不是可以做個(gè)自己的base32這類的編碼呢!歡迎朋友們交流!
標(biāo)簽:東莞 南昌 黔南 鹽城 桂林 景德鎮(zhèn) 文山 宣城
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Base64 編碼介紹、Base64編碼轉(zhuǎn)換原理與算法》,本文關(guān)鍵詞 Base64,編碼,介紹,轉(zhuǎn)換,原理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。