一癞季、什么是Base64編碼劫瞳?
Base64是網(wǎng)絡(luò)上最常見(jiàn)的用于傳輸8Bit字節(jié)碼的編碼方式之一倘潜,Base64就是一種基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的方法。
按照RFC2045的定義志于,Base64被定義為:Base64內(nèi)容傳送編碼被設(shè)計(jì)用來(lái)把任意序列的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是非英語(yǔ)國(guó)家最常用的編碼方式株汉。
例2、在Java持久化框架Hibernate中歌殃,就采用Base64來(lái)將一個(gè)較長(zhǎng)的唯一標(biāo)識(shí)符(128位的UUID)編碼為一個(gè)字符串乔妈,用作HTTP表單和HTTP GET URL中的參數(shù)。
例3氓皱、迅雷的“專(zhuān)用地址”也是用Base64"加密"的路召。
第一步、在地址的前后分別添加AA和ZZ波材;
第二步优训、對(duì)新的字符串進(jìn)行Base64編碼。
對(duì)應(yīng)的PHP代碼段如下:
if($button=="普通地址->迅雷地址")echo"thunder://".base64_encode("AA".$txt1."ZZ");
例4各聘、垃圾郵件的傳播者用Base64來(lái)避開(kāi)反垃圾郵件工具的掃描揣非,因?yàn)槟切┕ぞ咄ǔ6疾粫?huì)翻譯Base64的訊息。
四躲因、Base64編碼包含哪些字符早敬?
? ? ? “無(wú)圖無(wú)真相”,跳過(guò)原理部分大脉,我們一起來(lái)看一下Base64的字符表搞监。
? ? ? ?感覺(jué)是不是有些似曾相識(shí)?
? ? ? ? 計(jì)算機(jī)基礎(chǔ)知識(shí)通常會(huì)從二進(jìn)制镰矿,八進(jìn)制琐驴,十六進(jìn)制講起,然后介紹ASCII碼,ASCII碼包含128個(gè)字符绝淡,而B(niǎo)ase64編碼恰好是它的一半——64個(gè)字符宙刘。如上圖所示,標(biāo)準(zhǔn)Base64的字符包括:26個(gè)大寫(xiě)字母牢酵,26小寫(xiě)字母悬包,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ù)庫(kù)時(shí)還需要再進(jìn)行轉(zhuǎn)換丝格,因?yàn)锳NSI SQL中已將“%”號(hào)用作通配符撑瞧。為解決此問(wèn)題,可采用一種用于URL的改進(jìn)Base64編碼显蝌,它在末尾填充'='號(hào)预伺,并將標(biāo)準(zhǔn)Base64中的“+”和“/”分別改成了“-”和“_”,這樣就免去了在URL編解碼和數(shù)據(jù)庫(kù)存儲(chǔ)時(shí)所要作的轉(zhuǎn)換琅束,避免了編碼信息長(zhǎng)度在此過(guò)程中的增加,并統(tǒng)一了數(shù)據(jù)庫(kù)算谈、表單等處對(duì)象標(biāo)識(shí)符的格式涩禀。
五、有沒(méi)有Base64編碼的示例然眼?
下面就“舉一個(gè)栗子”:
1艾船、encodeImgageToBase64()將URL指向的圖片,轉(zhuǎn)化為字節(jié)數(shù)組字符串高每,并對(duì)其進(jìn)行Base64編碼處理屿岂,返回編碼后的字符串。
2鲸匿、打印出編碼后的Base64字符串爷怀, 并將編碼轉(zhuǎn)為圖片另存到本地。