Base64 算法原理,以及編碼、解碼【加密、解密】 介紹

    Base64編碼,是咱們程序開發中常常使用到的編碼方法。它是一種基於用64個可打印字符來表示二進制數據的表示方法。它一般用做存儲、傳輸一些二進制數據編碼方法!也是MIME(多用途互聯網郵件擴展,主要用做電子郵件標準)中一種可打印字符表示二進制數據的常見編碼方法!它其實只是定義用可打印字符傳輸內容一種方法,並不會產生新的字符集!有時候,咱們學習轉換的思路後,咱們其實也能夠結合本身的實際須要,構造一些本身接口定義編碼方式。好了,咱們一塊兒看看,它的轉換思路吧!php

Base64實現轉換原理html

    它是用64個可打印字符表示二進制全部數據方法。因爲2的6次方等於64,因此能夠用每6個位元爲一個單元,對應某個可打印字符。咱們知道三個字節有24個位元,就能夠恰好對應於4個Base64單元,即3個字節須要用4個Base64的可打印字符來表示。在Base64中的可打印字符包括字母A-Z、a-z、數字0-9 ,這樣共有62個字符,此外兩個可打印符號在不一樣的系統中通常有所不一樣。可是,咱們常常所說的Base64另外2個字符是:「+/」。這64個字符,所對應表以下。算法

編號 字符   編號 字符   編號 字符   編號 字符
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 /

    轉換的時候,將三個byte的數據,前後放入一個24bit的緩衝區中,先來的byte佔高位。數據不足3byte的話,於緩衝區中剩下的bit用0補足。而後,每次取出6個bit,按照其值選擇
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
中的字符做爲編碼後的輸出。不斷進行,直到所有輸入數據轉換完成。學習

    若是最後剩下兩個輸入數據,在編碼結果後加1個「=」;若是最後剩下一個輸入數據,編碼結果後加2個「=」;若是沒有剩下任何數據,就什麼都不要加,這樣才能夠保證資料還原的正確性。編碼

    編碼後的數據比原始數據略長,爲原來的4/3。不管什麼樣的字符都會所有被編碼,所以不像Quoted-printable 編碼,還保留部分可打印字符。因此,它的可讀性不如Quoted-printable編碼! spa

文本 M a n
ASCII編碼 77 97 110
二進制位 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,前六位對應值爲19,對應base64字符是T,如此類推。其它字符編碼就能夠自動轉換獲得!咱們看看另外不是恰好是3個字節的狀況! .net

文本(1 Byte) A    
二進制位 0 1 0 0 0 0 0 1                                
二進制位(補0) 0 1 0 0 0 0 0 1 0 0 0 0                        
Base64編碼 Q Q = =
文本(2 Byte) B C  
二進制位 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1     x x x x x x
二進制位(補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轉換代碼實現code

     既然知道了方法,那麼咱們若是要本身寫個簡單轉換,好像也是很容易的!下面,我寫下我作轉換php代碼!htm

<?phpblog

/**

*base64編碼方法、本方法只是作base64轉換過程代碼舉例說明,經過該例子能夠任意改造不一樣語言版

*@author 程默

*@copyright http://blog.chacuo.net

*@param $src 原字符串

*@return string base64字符串*

*/

function c_base64_encode($src)

{

static $base="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

////將原始的3個字節轉換爲4個字節

$slen=strlen($src);

$smod = ($slen%3);

$snum = floor($slen/3);

$desc = array();

for($i=0;$i<$snum;$i++)

{

////讀取3個字節

$_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倍數字節

$_arr = array_map('ord',str_split(substr($src,$snum*3,3)));

$_dec0= $_arr[0]>>2;

///只有一個字節

if(!isset($_arr[1]))

{

$_dec1= (($_arr[0]&3)<<4);

$_dec2=$_dec3="=";

}

else

{

///2個字節

$_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編碼轉換原理 

    好了,經過這個例子,我想base64編碼轉換原理、算法有些瞭解了吧!它轉換過程很簡單,只須要作個映射表,而後將原先作一些移位運算就能夠完成!咱們經過該例子,是否是能夠作個本身的base32這類的編碼呢!歡迎朋友們交流!

 

做者:程默的博客  QQ:8292669
原文網址:http://blog.chacuo.net/719.html
訂閱保持關注:http://blog.chacuo.net/feed 本文版權歸做者全部,歡迎轉載,請務必添加原文連接。

相關文章
相關標籤/搜索