在MIME格式的電子郵件中,base64可以用來將binary的字節(jié)序列數(shù)據(jù)編碼成ASCII字符序列構(gòu)成的文本。使用時,在傳輸編碼方式中指定base64。使用的字符包括大小寫字母各26個,加上10個數(shù)字,和加號“+”,斜杠“/”,一共64個字符,等號“=”用來作為后綴用途。
完整的base64定義可見 RFC 1421和 RFC 2045。編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長,為原來的
。在電子郵件中,根據(jù)RFC 822規(guī)定,每76個字符,還需要加上一個回車換行??梢怨浪憔幋a后數(shù)據(jù)長度大約為原長的135.1%。轉(zhuǎn)換的時候,將三個byte的數(shù)據(jù),先后放入一個24bit的緩沖區(qū)中,先來的byte占高位。數(shù)據(jù)不足3byte的話,于緩沖區(qū)中剩下的bit用0補足。然后,每次取出6(因為26 = 64)個bit,按照其值選擇ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
中的字符作為編碼后的輸出。不斷進(jìn)行,直到全部輸入數(shù)據(jù)轉(zhuǎn)換完成。
如果最后剩下兩個輸入數(shù)據(jù),在編碼結(jié)果后加1個“=”;如果最后剩下一個輸入數(shù)據(jù),編碼結(jié)果后加2個“=”;如果沒有剩下任何數(shù)據(jù),就什么都不要加,這樣才可以保證資料還原的正確性。
Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure. |
經(jīng)過base64編碼之后變成:
TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=
文本 | M | a | n | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII編碼 | 77 | 97 | 110 | |||||||||||||||||||||
二進(jìn)制位 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
索引 | 19 | 22 | 5 | 46 | ||||||||||||||||||||
Base64編碼 | T | W | F | u |
在此例中,Base64算法將三個字符編碼為4個字符
Base64索引表:
Value | Char | Value | Char | Value | Char | Value | Char | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w | |||
1 | B | 17 | R | 33 | h | 49 | x | |||
2 | C | 18 | S | 34 | i | 50 | y | |||
3 | D | 19 | T | 35 | j | 51 | z | |||
4 | E | 20 | U | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | l | 53 | 1 | |||
6 | G | 22 | W | 38 | m | 54 | 2 | |||
7 | H | 23 | X | 39 | n | 55 | 3 | |||
8 | I | 24 | Y | 40 | o | 56 | 4 | |||
9 | J | 25 | Z | 41 | p | 57 | 5 | |||
10 | K | 26 | a | 42 | q | 58 | 6 | |||
11 | L | 27 | b | 43 | r | 59 | 7 | |||
12 | M | 28 | c | 44 | s | 60 | 8 | |||
13 | N | 29 | d | 45 | t | 61 | 9 | |||
14 | O | 30 | e | 46 | u | 62 | + | |||
15 | P | 31 | f | 47 | v | 63 | / |
UTF-7 是一個修改的Base64(Modified Base64)。主要是將UTF-16的數(shù)據(jù),用Base64的方法編碼為可打印的 ASCII 字符序列。目的是傳輸 Unicode 數(shù)據(jù)。主要的區(qū)別在于不用等號"="補余,因為該字符通常需要大量的轉(zhuǎn)譯。
標(biāo)準(zhǔn)可見RFC 2152,《A Mail-Safe Transformation Format of Unicode》。
在IRCu等軟件所使用的P10 IRC服務(wù)器間協(xié)議中,對客戶與服務(wù)器的消息類型號(client/server numerics)和二進(jìn)制IP地址采用了base64編碼。消息類型號的長度固定為3字節(jié),故可直接編碼為4個字節(jié)而不需要加填充。對IP地址進(jìn)行編碼時,則需要在地址前添加一些0比特,使之可以編碼為整數(shù)個字節(jié)。這里所用的符號集與前述MIME的也有所不同,將+/改成了[]。
Base64編碼可用于在HTTP環(huán)境下傳遞較長的標(biāo)識信息。例如,在Java持久化系統(tǒng)Hibernate中,就采用了Base64來將一個較長的唯一標(biāo)識符(一般為128-bit的UUID)編碼為一個字符串,用作HTTP表單和HTTP GET URL中的參數(shù)。在其他應(yīng)用程序中,也常常需要把二進(jìn)制數(shù)據(jù)編碼為適合放在URL(包括隱藏表單域)中的形式。此時,采用Base64編碼不僅比較簡短,同時也具有不可讀性,即所編碼的數(shù)據(jù)不會被人用肉眼所直接看到。
然而,標(biāo)準(zhǔn)的Base64并不適合直接放在URL里傳輸,因為URL編碼器會把標(biāo)準(zhǔn)Base64中的“/”和“+”字符變?yōu)樾稳纭?XX”的形式,而這些“%”號在存入數(shù)據(jù)庫時還需要再進(jìn)行轉(zhuǎn)換,因為ANSI SQL中已將“%”號用作通配符。
為解決此問題,可采用一種用于URL的改進(jìn)Base64編碼,它不在末尾填充'='號,并將標(biāo)準(zhǔn)Base64中的“+”和“/”分別改成了“*”和“-”,這樣就免去了在URL編解碼和數(shù)據(jù)庫存儲時所要作的轉(zhuǎn)換,避免了編碼信息長度在此過程中的增加,并統(tǒng)一了數(shù)據(jù)庫、表單等處對象標(biāo)識符的格式。
另有一種用于正則表達(dá)式的改進(jìn)Base64變種,它將“+”和“/”改成了“!”和“-”,因為“+”,“*”以及前面在IRCu中用到的“[”和“]”在正則表達(dá)式中都可能具有特殊含義。
此外還有一些變種,它們將“+/”改為“_-”或“._”(用作編程語言中的標(biāo)識符名稱)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。
聯(lián)系客服