Atitit.Base64編碼原理與實現設計
1. Base64編碼1
1.1. 為什麼要用自己的base64編碼方案1
2. Base64編碼由來1
3. Base64編碼原理1
3.1. 具體來說,轉換方式可以分為四步:2
3.2. 注意2
3.3. Padding3
4. URL安全的Base64編碼3
防止apache codec jdk的jar沖突。
Base64最早是用來解決電子郵件的傳輸問題。
傳統的電子郵件是1982年定下技術規范的,詳見rfc0822。該規范的一個重要特點,就是規定電子郵件只能使用ASCII可打印字符。這就導致非英語字符或二進制文件(比如圖片)不同通過電子郵件進行傳輸了。
作者:: ★(attilax)>>> 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 ) 漢字名:艾龍, EMAIL:[email protected]
轉載請注明來源: http://www.cnblogs.com/attilax/
簡單來說, Base64編碼就是從ASCII碼中選出64個字符----大寫字母A-Z、小寫字母a-z、數字0-9、符號"+"、"/"(再加上作為填充字符的"=",實際上是65個字符),作為一個基本字符集。然後,其他所有符號都轉換成這個字符集中的字符。
1. 將每三個字節分成一組,一共24個二進制位:3*8=24
2. 將這24個二進制位分成4組,每組有6個二進制位:24/4=6
3. 在每組前加兩00,擴展成32個二進制位,即4個字節:4*(6+2)=32
4.
根據下面的編碼表,得到擴展後每個字節的對應符號,就是Base64的編碼值
5.
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
6.
1. 因為轉換後的每個字符的最高兩位都是0,所以實際有效位數是6位,也就是26=64個字符就可以覆蓋所有的編碼。
2. 如果剩下的字符不足3個字節,則用0填充,輸出字符使用"=",因此編碼後輸出的文本末尾可能會出現1或2個"="。
3. 因為Base64將3個字節轉化成4個字節,因此Base64編碼後的文本,會比原文本大出三分之一左右。
Base64是三個字節(Bytes)作為一組(24-bit block)的編碼轉換,如果字節數不是三的倍數,那麼就會出最後一組只有一個或者兩個字節的情況,按下面的規則處理:
1. 一個字節的情況:將這一個字節的8個二進制位,按照每組6個二進制位轉成二組,最後一組除了前面加二個0以外,後面再加4個0。這樣得到一個二位的Base64編碼,再在末尾補上兩個"="號。
2. 二個字節的情況:將這二個字節的一共16個二進制位,按每組6個二進制位轉成三組,最後一組除了前面加兩個0以外,後面也要加兩個0。這樣得到一個三位的Base64編碼,再在末尾補上一個"="號。
參考base64架構圖片
由於‘+’,‘/’兩個字符在URL中有特殊含義,將Base64編碼後的數據在通過URL傳輸時需要通過URL編碼進行轉義,但是這樣子會導致URL無意義的變長,而且多了一個URL編解碼步驟。為了避免這個問題,出現了一種用於URL的改進Base64編碼變種,它其實就是簡單的把標准Base64中的'+'和'/'分別改成了'-'和'_'。對於填充字符'=',有些變種是把它直接去掉,有些則是把它替換成'.'。
Base64編碼學習筆記 - 簡書.html