一、什么是Base64編碼?
Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的方法。
按照RFC2045的定義,Base64被定義為:Base64內(nèi)容傳送編碼被設(shè)計(jì)用來把任意序列的8位字節(jié)描述為一種不易被人直接識(shí)別的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
二、為什么要使用Base64編碼?
Base64 不是加密算法,它主要的用途是把一些二進(jìn)制數(shù)轉(zhuǎn)成普通字符用于網(wǎng)絡(luò)傳輸。由于一些二進(jìn)制字符在傳輸協(xié)議中屬于控制字符,不能直接傳送,需要轉(zhuǎn)換一下。
三、在哪兒用到了Base64編碼?
例1、電子郵件MIME協(xié)議的傳送編碼域,?Base64是非英語國(guó)家最常用的編碼方式。
例2、在Java持久化框架Hibernate中,就采用Base64來將一個(gè)較長(zhǎng)的唯一標(biāo)識(shí)符(128位的UUID)編碼為一個(gè)字符串,用作HTTP表單和HTTP GET URL中的參數(shù)。
例3、迅雷的“專用地址”也是用Base64"加密"的。
第一步、在地址的前后分別添加AA和ZZ;
第二步、對(duì)新的字符串進(jìn)行Base64編碼。
對(duì)應(yīng)的PHP代碼段如下:
if($button=="普通地址->迅雷地址")echo"thunder://".base64_encode("AA".$txt1."ZZ");
例4、垃圾郵件的傳播者用Base64來避開反垃圾郵件工具的掃描,因?yàn)槟切┕ぞ咄ǔ6疾粫?huì)翻譯Base64的訊息。
四、Base64編碼包含哪些字符?
? ? ? “無圖無真相”,跳過原理部分,我們一起來看一下Base64的字符表。
? ? ? ?感覺是不是有些似曾相識(shí)?

? ? ? ? 計(jì)算機(jī)基礎(chǔ)知識(shí)通常會(huì)從二進(jìn)制,八進(jìn)制,十六進(jìn)制講起,然后介紹ASCII碼,ASCII碼包含128個(gè)字符,而Base64編碼恰好是它的一半——64個(gè)字符。如上圖所示,標(biāo)準(zhǔn)Base64的字符包括:26個(gè)大寫字母,26小寫字母,10個(gè)阿拉伯?dāng)?shù)字,以及2個(gè)運(yùn)算符號(hào)+和/。
? ? ? ? ?標(biāo)準(zhǔn)的Base64并不適合直接放在URL里傳輸,因?yàn)閁RL編碼器會(huì)把標(biāo)準(zhǔn)Base64中的“/”和“+”字符變?yōu)樾稳纭?XX”的形式,而這些“%”號(hào)在存入數(shù)據(jù)庫時(shí)還需要再進(jìn)行轉(zhuǎn)換,因?yàn)锳NSI SQL中已將“%”號(hào)用作通配符。為解決此問題,可采用一種用于URL的改進(jìn)Base64編碼,它在末尾填充'='號(hào),并將標(biāo)準(zhǔn)Base64中的“+”和“/”分別改成了“-”和“_”,這樣就免去了在URL編解碼和數(shù)據(jù)庫存儲(chǔ)時(shí)所要作的轉(zhuǎn)換,避免了編碼信息長(zhǎng)度在此過程中的增加,并統(tǒng)一了數(shù)據(jù)庫、表單等處對(duì)象標(biāo)識(shí)符的格式。
五、有沒有Base64編碼的示例?
下面就“舉一個(gè)栗子”:
1、encodeImgageToBase64()將URL指向的圖片,轉(zhuǎn)化為字節(jié)數(shù)組字符串,并對(duì)其進(jìn)行Base64編碼處理,返回編碼后的字符串。

2、打印出編碼后的Base64字符串, 并將編碼轉(zhuǎn)為圖片另存到本地。

