Base64編碼,是我們程式開發中經常使用到的編碼方法。它是一種基於用64個可列印字元來表示位元據的表示方法。它通常用作儲存、傳輸一些位元據編碼方法!也是MIME(多用途互連網郵件擴充,主要用作電子郵件標準)中一種可列印字元表示位元據的常見編碼方法!它其實只是定義用可列印字元傳輸內容一種方法,並不會產生新的字元集!有時候,我們學習轉換的思路後,我們其實也可以結合自己的實際需要,構造一些自己介面定義編碼方式。好了,我們一起看看,它的轉換思路吧!
Base64實現轉換原理
它是用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編碼!
| 文本 |
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個位元組的情況!
| 文本(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轉碼實現
既然知道了方法,那麼我們如果要自己寫個簡單轉換,好像也是很容易的!下面,我寫下我做轉換php代碼!
/**
*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
本文著作權歸作者所有,歡迎轉載,請務必添加原文連結。
http://www.bkjia.com/PHPjc/771651.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/771651.htmlTechArticleBase64編碼,是我們程式開發中經常使用到的編碼方法。它是一種基於用64個可列印字元來表示位元據的表示方法。它通常用作儲存、傳...