Base64編碼簡介。
之前面試曾被問到Base64的64是指什麼,我拿這問題去問很多人都會回答64位元,但正確答案是指64個ASCII可印字元(原於26 = 64,也就是64種變化),包括英文大寫A-Z
26個,英文小寫a-z
26個,數字0-9
10個,加號+
及斜線/
總共64個字元。而等號=
是用來補足結尾部分(pad)不屬於Base64碼。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Base64意思就是拿這64個字元來表示二進位的編碼,通常是用在二進位資料的傳輸及儲存上,原因是因為如果直接以二進位串流傳輸資料,在某些傳輸協議(protocol)可能錯誤解讀造成錯誤。
Base64編碼是將二進位資料以每3位元組(bytes)(也就是24位元(bits))切分,然後再以每6bits轉成十進位數字然後對照Base64索引表如下轉成對映的字元。
如果全部的資料bits無法被3整除(因為要以3個位元組來轉換),則不足的部分以0補足長度後再轉換。轉為Base64編碼後的最後6位元如果都是0則以等號=
表示。
數值 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
字元 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P |
數值 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | ||||||
字元 | Q | R | S | T | U | V | W | X | Y | Z | ||||||
數值 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 |
字元 | a | b | c | d | e | f | g | h | i | j | k | k | m | n | o | p |
數值 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | ||||||
字元 | q | r | s | t | u | v | w | x | y | z | ||||||
數值 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | ||||
字元 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | + | / |
例如把KFC
進行Base64編碼為S0ZD
的過程如下。
KFC
由K
、F
、C
三個英文字組成,對照ASCII表的十進位(decimal)值如下。
Char | K | F | C |
Dec | 75 | 70 | 67 |
每個字的十進位值再轉為二進位(binary)如下
Char | K | F | C | |||||||||||||||||||||
Dec | 75 | 70 | 97 | |||||||||||||||||||||
Bin | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
將二進位資料再以每3位元組切分,最後不足長度補0。三個字剛好3位元組所以不用補0。
然後再以每6bits轉成十進位數字然後對照Base64索引表如下轉成對映的字元。
Char | K | F | C | |||||||||||||||||||||
Dec | 75 | 70 | 97 | |||||||||||||||||||||
Bin | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
Dec | 18 | 52 | 25 | 3 | ||||||||||||||||||||
Base64 code | S | 0 | Z | D |
Base64編碼定義參考RFC 4648>
至於Base64URL編碼則是Base64的修改以符合HTTP傳輸資料時的URL合法字元。
沒有留言:
張貼留言