Base64編碼與解碼原理


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是遇到不在其中的字符時,將會跳過這些字符,僅將合法字符組成一個新的字符串進行解碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM