Base64編碼是使用64個可打印ASCII字符(A-Z、a-z、0-9、+、/)將任意字節序列數據編碼成ASCII字符串,另有“=”符號用作后綴用途。
base64索引表
base64編碼與解碼的基礎索引表如下
base64編碼原理
(1)base64編碼過程
Base64將輸入字符串按字節切分,取得每個字節對應的二進制值(若不足8比特則高位補0),然后將這些二進制數值串聯起來,再按照6比特一組進行切分(因為2^6=64),最后一組若不足6比特則末尾補0。將每組二進制值轉換成十進制,然后在上述表格中找到對應的符號並串聯起來就是Base64編碼結果。
由於二進制數據是按照8比特一組進行傳輸,因此Base64按照6比特一組切分的二進制數據必須是24比特的倍數(6和8的最小公倍數)。24比特就是3個字節,若原字節序列數據長度不是3的倍數時且剩下1個輸入數據,則在編碼結果后加2個=;若剩下2個輸入數據,則在編碼結果后加1個=。
完整的Base64定義可見RFC1421和RFC2045。因為Base64算法是將3個字節原數據編碼為4個字節新數據,所以Base64編碼后的數據比原始數據略長,為原來的4/3。
(2)簡單編碼流程
1)將所有字符轉化為ASCII碼; 2)將ASCII碼轉化為8位二進制; 3)將8位二進制3個歸成一組(不足3個在后邊補0)共24位,再拆分成4組,每組6位; 4)將每組6位的二進制轉為十進制; 5)從Base64編碼表獲取十進制對應的Base64編碼;
下面舉例對字符串“ABCD”
進行base64編碼:
對於不足6位的補零(圖中淺紅色的4位),索引為“A”;對於最后不足3字節,進行補零處理(圖中紅色部分),以“=”替代,因此,“ABCD”的base64編碼為:“QUJDRA==”。
base64解碼原理
(1)base64解碼過程
base64解碼,即是base64編碼的逆過程,如果理解了編碼過程,解碼過程也就容易理解。將base64編碼數據根據編碼表分別索引到編碼值,然后每4個編碼值一組組成一個24位的數據流,解碼為3個字符。對於末尾位“=”的base64數據,最終取得的4字節數據,需要去掉“=”再進行轉換。
解碼過程可以參考上圖,逆向理解:“QUJDRA==” ——>“ABCD”
(2)base64解碼特點
base64編碼中只包含64個可打印字符,而PHP在解碼base64時,遇到不在其中的字符時,將會跳過這些字符,僅將合法字符組成一個新的字符串進行解碼。下面編寫一個簡單的代碼,測試一組數據看是否滿足我們所說的情況。
<?php
$basestr0="vegerootQftm";
$basestr1="vege#root@Qftm";
$basestr2="vege^root&Qftm";
$basestr3="veg>ero%otQftm";
$basestr4="ve%%%geroo%%%tQftm";
echo base64_decode($basestr0)."<br>";
echo base64_decode($basestr1)."<br>";
echo base64_decode($basestr2)."<br>";
echo base64_decode($basestr3)."<br>";
echo base64_decode($basestr4)."<br>";
?>
從結果中可以看到一個字符串中,不管出現多少個特殊字符或者位置上的差異,都不會影響最終的結果,可以驗證base64_decode是遇到不在其中的字符時,將會跳過這些字符,僅將合法字符組成一個新的字符串進行解碼。