網頁

2022/6/15

Base64編碼是什麼?

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的過程如下。

KFCKFC三個英文字組成,對照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合法字元。


沒有留言:

張貼留言