Base 16
Base16編碼使用16個ASCII可打印字符(數字0-9和字母A-F)對任意字節數據進行編碼。Base16先獲取輸入字符串每個字節的二進制值(不足8比特在高位補0),然后將其串聯進來,再按照4比特一組進行切分,將每組二進制數分別轉換成十進制,在下述表格中找到對應的編碼串接起來就是Base16編碼。
可以看到8比特數據按照4比特切分剛好是兩組,所以Base16不可能用到填充符號“=”。
Base16編碼后的數據量是原數據的兩倍:1000比特數據需要250個字符(即 250*8=2000 比特)。
換句話說:Base16使用兩個ASCII字符去編碼原數據中的一個字節數據。
Base16編碼是一個標准的十六進制字符串(不是數值),更易被人類和計算機使用,因為它並不包含任何控制字符,以及Base64和Base32中的“=”符號.輸入的非ASCII字符,使用UTF-8字符集。
Base 32
Base32編碼是使用32個可打印字符(字母A-Z和數字2-7)對任意字節數據進行編碼的方案,編碼后的字符串不用區分大小寫並排除了容易混淆的字符,可以方便地由人類使用並由計算機處理。
Base32將任意字符串按照字節進行切分,並將每個字節對應的二進制值(不足8比特高位補0)串聯起來,按照5比特一組進行切分,並將每組二進制值轉換成十進制來對應32個可打印字符中的一個。
由於數據的二進制傳輸是按照8比特一組進行(即一個字節),因此Base32按5比特切分的二進制數據必須是40比特的倍數(5和8的最小公倍數)。例如輸入單字節字符“%”,它對應的二進制值是“100101”,前面補兩個0變成“00100101”(二進制值不足8比特的都要在高位加0直到8比特),從左側開始按照5比特切分成兩組:“00100”和“101”,后一組不足5比特,則在末尾填充0直到5比特,變成“00100”和“10100”,這兩組二進制數分別轉換成十進制數,通過上述表格即可找到其對應的可打印字符“E”和“U”,但是這里只用到兩組共10比特,還差30比特達到40比特,按照5比特一組還需6組,則在末尾填充6個“=”。填充“=”符號的作用是方便一些程序的標准化運行,大多數情況下不添加也無關緊要,而且,在URL中使用時必須去掉“=”符號。
與Base64相比,Base32具有許多優點:
適合不區分大小寫的文件系統,更利於人類口語交流或記憶。
結果可以用作文件名,因為它不包含路徑分隔符 “/”等符號。
排除了視覺上容易混淆的字符,因此可以准確的人工錄入。(例如,RFC4648符號集忽略了數字“1”、“8”和“0”,因為它們可能與字母“I”,“B”和“O”混淆)。
排除填充符號“=”的結果可以包含在URL中,而不編碼任何字符。
Base32也比Base16有優勢:
Base32比Base16占用的空間更小。(1000比特數據Base32需要200個字符,而Base16則為250個字符)
Base32的缺點:
Base32比Base64多占用大約20%的空間。因為Base32使用8個ASCII字符去編碼原數據中的5個字節數據,而Base64是使用4個ASCII字符去編碼原數據中的3個字節數據。
Base 64
Base64編碼是使用64個可打印ASCII字符(A-Z、a-z、0-9、+、/)將任意字節序列數據編碼成ASCII字符串,另有“=”符號用作后綴用途。
Base64將輸入字符串按字節切分,取得每個字節對應的二進制值(若不足8比特則高位補0),然后將這些二進制數值串聯起來,再按照6比特一組進行切分(因為2^6=64),最后一組若不足6比特則末尾補0。將每組二進制值轉換成十進制,然后在上述表格中找到對應的符號並串聯起來就是Base64編碼結果。
由於二進制數據是按照8比特一組進行傳輸,因此Base64按照6比特一組切分的二進制數據必須是24比特的倍數(6和8的最小公倍數)。24比特就是3個字節,若原字節序列數據長度不是3的倍數時且剩下1個輸入數據,則在編碼結果后加2個=;若剩下2個輸入數據,則在編碼結果后加1個=。
因為Base64算法是將3個字節原數據編碼為4個字節新數據,所以Base64編碼后的數據比原始數據略長,為原來的4/3。在電子郵件中,根據RFC822規定,每76個字符,還需要加上一個回車換行。可以估算編碼后數據長度大約為原長的135.1%。
Base64可用於任意數據的底層二進制數據編碼,以應用於只能傳輸ASCII字符的場合。不過最常用於文本數據的處理傳輸,例如在MIME格式的電子郵件中,Base64可以用來編碼郵件內容,方便在不同語言計算機間傳輸而不亂碼,注意是傳輸而不是顯示,例如在西歐地區計算機上使用utf-8編碼即可正常顯示中文(安裝有對應字庫),但是它未必能正常傳輸中文,這時轉換為Base64便無此顧慮。
Base64編碼若無特別說明,通常約定非ASCII字符按照UTF-8字符集進行編碼處理。
Base 58
和通常base64編碼一樣,base58編碼的作用也是將非可視字符可視化(ASCII化)。但不同的是base58編碼去掉了幾個看起來會產生歧義的字符,如 0 (零), O (大寫字母O), I (大寫的字母i) and l (小寫的字母L) ,和幾個影響雙擊選擇的字符,如/, +。結果字符集正好58個字符(包括9個數字,24個大寫字母,25個小寫字母)。而且因為58 不是2的整次冪,所以沒有使用類似base64編碼中使用直接截取3個字符轉4個字符(3*8=4*6 , 2的6次方剛好64)的方法進行轉換,而是采用我們數學上經常使用的進制轉換方法——輾轉相除法(本質上,base64編碼是64進制,base58是58進制)