百科解釋
目錄·MIME·UTF-7·IRCu·在URL中的應(yīng)用·其他應(yīng)用 Base64是一種使用64基的位置計數(shù)法。它使用2的最大次方來代表僅可打印的ASCII 字符。這使它可用來作為電子郵件的傳輸編碼。在Base64中的變量使用字符A-Z、a-z和0-9 ,這樣共有62個字符,用來作為開始的64個數(shù)字,最后兩個用來作為數(shù)字的符號在不同的系統(tǒng)中而不同。一些如uuencode的其他編碼方法,和之后binhex的版本使用不同的64字符集來代表6個二進(jìn)制數(shù)字,但是它們不叫Base64。 MIME 在MIME格式的電子郵件中,base64可以用來將binary的字節(jié)序列數(shù)據(jù)編碼成ASCII字符序列構(gòu)成的文本。使用時,在傳輸編碼方式中指定base64。使用的字符包括大小寫字母各26個,加上10個數(shù)字,和加號“+”,斜杠“/”,一共64個字符,等號“=”用來作為后綴用途。 完整的base64定義可見 RFC1421和 RFC2045。編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長,為原來的4/3。在電子郵件中,根據(jù)RFC822規(guī)定,每76個字符,還需要加上一個回車換行?梢怨浪憔幋a后數(shù)據(jù)長度大約為原長的135.1%。 轉(zhuǎn)換的時候,將三個byte的數(shù)據(jù),先后放入一個24bit的緩沖區(qū)中,先來的byte占高位。數(shù)據(jù)不足3byte的話,于緩沖區(qū)中剩下的Bit用0補足。然后,每次取出6個bit,按照其值選擇<code>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/</code>中的字符作為編碼后的輸出。不斷進(jìn)行,直到全部輸入數(shù)據(jù)轉(zhuǎn)換完成。 如果最后剩下兩個輸入數(shù)據(jù),在編碼結(jié)果后加1個“=”;如果最后剩下一個輸入數(shù)據(jù),編碼結(jié)果后加2個“=”;如果沒有剩下任何數(shù)據(jù),就什么都不要加,這樣才可以保證資料還原的正確性。 舉例來說,一段引用自Thomas Hobbes&#39;&#39;&#39;&#39;s Leviathan的文句: 經(jīng)過base64編碼之后變成: TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4= 一個例子 編碼“Man” 「M」的ASCII碼 = 77 = 01001101 「a」的 = 97 = 01100001 「n」的 = 110 = 01101110 將這三個字節(jié)拼合,得出一個24位的資料: <code>010011010110000101101110</code> 現(xiàn)在六個一組的分開,這樣便得到六個數(shù)。將這些數(shù)轉(zhuǎn)為: 010011 = 19 = T (T是第19個英文字母) 010110 = 22 = W (W是第22個英文字母) 000101 = 5 = F 101110 = 46 = u (U是第20個英文字母) base64編碼是: <code>00010011 00010110 00000101 00101110</code> 即是每3個未編碼字節(jié),編碼后會得到4個字節(jié)。 加密M:M=01001101,變成加密010011010000,六個一組分開是010011 010000,結(jié)果是TQ,然后在后面加兩個“=”,結(jié)果就是“TQ==”。 UTF-7 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 在IRCu等軟件所使用的P10 IRC服務(wù)器間協(xié)議中,對客戶與服務(wù)器的消息類型號(client/server numerics)和二進(jìn)制IP地址采用了base64編碼。消息類型號的長度固定為3字節(jié),故可直接編碼為4個字節(jié)而不需要加填充。對IP地址進(jìn)行編碼時,則需要在地址前添加一些0比特,使之可以編碼為整數(shù)個字節(jié)。這里所用的符號集與前述MIME的也有所不同,將+/改成了[]。 在URL中的應(yīng)用 Base64編碼可用于在HTTP環(huán)境下傳遞較長的標(biāo)識信息。例如,在Java Persistence系統(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編碼,它不在末尾填充&#39;&#39;&#39;&#39;=&#39;&#39;&#39;&#39;號,并將標(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)。 其他應(yīng)用 Mozilla Thunderbird和Evolution用Base64來保密電子郵件密碼 Base64 也會經(jīng)常用作一個簡單的“加密”來保護(hù)某些數(shù)據(jù),而真正的加密通常都比較繁瑣。 垃圾訊息傳播者用Base64來避過反垃圾郵件工具,因為那些工具通常都不會翻譯Base64的訊息。 在LDIF檔案,Base64用作編碼字串。
移動通信網(wǎng) | 通信人才網(wǎng) | 更新日志 | 團(tuán)隊博客 | 免責(zé)聲明 | 關(guān)于詞典 | 幫助