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
<?php
blog
/**
*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編碼轉換原理、算法有些瞭解了吧!它轉換過程很簡單,只須要作個映射表,而後將原先作一些移位運算就能夠完成!咱們經過該例子,是否是能夠作個本身的base32這類的編碼呢!歡迎朋友們交流!
做者:程默的博客 QQ:8292669
原文網址:http://blog.chacuo.net/719.html
訂閱保持關注:http://blog.chacuo.net/feed 本文版權歸做者全部,歡迎轉載,請務必添加原文連接。