本頁使用了標題或全文手工轉換

Base64

維基百科,自由的百科全書
前往: 導覽搜尋

Base64是一種基於64個可列印字元來表示二進位資料的表示方法。由於2的6次方等於64,所以每6個位元為一個單元,對應某個可列印字元。三個位元組有24個位元,對應於4個Base64單元,即3個位元組可表示4個可列印字元。它可用來作為電子郵件的傳輸編碼。在Base64中的可列印字元包括字母A-Z、a-z、數字0-9,這樣共有62個字元,此外兩個可列印符號在不同的系統中而不同。一些如uuencode的其他編碼方法,和之後binhex的版本使用不同的64字元集來代表6個二進位數字,但是它們不叫Base64。

記數系統
印度-阿拉伯數字系統
西方阿拉伯數字
阿拉伯文數字
高棉數字
印度數字
波羅米數字
泰語數字
漢字文化圈記數系統
中文數字
閩南語數字
越南語數字
算籌
日語數字
朝鮮文數字
蘇州碼子
字母記數系統
阿拉伯字母數字
亞美尼亞數字
西里爾數字
吉茲數字
希伯來數字
希臘數字
阿利耶波多數字
其它記數系統
雅典數字
巴比倫數字
古埃及數字
伊特拉斯坎數字
瑪雅數字
羅馬數字
底數區分的進位制系統
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 20 60 64

Base64常用於在通常處理文字資料的場合,表示、傳輸、儲存一些二進位資料。包括MIME的email、在XML中儲存複雜資料。

MIME[編輯]

MIME格式的電子郵件中,base64可以用來將binary的位元組序列資料編碼成ASCII字元序列構成的文字。使用時,在傳輸編碼方式中指定base64。使用的字元包括大小寫字母各26個,加上10個數字,和加號「+」,斜槓「/」,一共64個字元,等號「=」用來作為字尾用途。

完整的base64定義可見RFC 1421和RFC 2045。編碼後的資料比原始資料略長,為原來的4/3。在電子郵件中,根據RFC 822規定,每76個字元,還需要加上一個Enter換行。可以估算編碼後資料長度大約為原長的135.1%。

轉換的時候,將三個byte的資料,先後放入一個24bit的緩衝區中,先來的byte占高位。資料不足3byte的話,於緩衝區中剩下的bit用0補足。然後,每次取出6(因為26=64)個bit,按照其值選擇ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字元作為編碼後的輸出。不斷進行,直到全部輸入資料轉換完成。

當原資料長度不是3的整數倍時, 如果最後剩下一個輸入資料,在編碼結果後加2個「=」;如果最後剩下兩個輸入資料,編碼結果後加1個「=」;如果沒有剩下任何資料,就什麼都不要加,這樣才可以保證資料還原的正確性。

例子[編輯]

舉例來說,一段參照自托馬斯·霍布斯利維坦》的文句:

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.

經過base64編碼之後變成:

TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=
  • 編碼「Man」
文字 M a n
ASCII編碼 77 97 110
二進位位 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索引表:

數值 字元   數值 字元   數值 字元   數值 字元
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 /

如果要編碼的位元組數不能被3整除,最後會多出1個或2個位元組,那麼可以使用下面的方法進行處理:先使用0位元組值在末尾補足,使其能夠被3整除,然後再進行base64的編碼。在編碼後的base64文字後加上一個或兩個'='號,代表補足的位元組數。也就是說,當最後剩餘一個八位位元組(一個byte)時,最後一個6位的base64位元組塊有四位是0值,最後附加上兩個等號;如果最後剩餘兩個八位位元組(2個byte)時,最後一個6位的base位元組塊有兩位是0值,最後附加一個等號。 參考下表:

文字(1 Byte) A
二進位位 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
二進位位(補0) 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Base64編碼 Q Q = =
文字(2 Byte) B C
二進位位 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0
二進位位(補0) 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0
Base64編碼 Q k M =

UTF-7[編輯]

UTF-7是一個修改的Base64(Modified Base64)。主要是將UTF-16的資料,用Base64的方法編碼為可列印的ASCII字元序列。目的是傳輸Unicode資料。主要的區別在於不用等號"="補餘,因為該字元通常需要大量的轉譯。

標準可見RFC 2152,《A Mail-Safe Transformation Format of Unicode》。

IRCu[編輯]

IRCu等軟體所使用的P10 IRC伺服器間協定中,對客戶與伺服器的訊息類型號(client/server numerics)和二進位IP位址採用了base64編碼。訊息類型號的長度固定為3位元組,故可直接編碼為4個位元組而不需要加填充。對IP位址進行編碼時,則需要在位址前添加一些0位元,使之可以編碼為整數個位元組。這裡所用的符號集與前述MIME的也有所不同,將+/改成了[]。

在URL中的應用[編輯]

Base64編碼可用於在HTTP環境下傳遞較長的標識資訊。例如,在Java持久化系統Hibernate中,就採用了Base64來將一個較長的唯一識別元(一般為128-bit的UUID)編碼為一個字串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程式中,也常常需要把二進位資料編碼為適合放在URL(包括隱藏表單域)中的形式。此時,採用Base64編碼不僅比較簡短,同時也具有不可讀性,即所編碼的資料不會被人用肉眼所直接看到。

然而,標準的Base64並不適合直接放在URL裡傳輸,因為URL編碼器會把標準Base64中的「/」和「+」字元變為形如「%XX」的形式,而這些「%」號在存入資料庫時還需要再進行轉換,因為ANSI SQL中已將「%」號用作通配符。

為解決此問題,可採用一種用於URL的改進Base64編碼,它不在末尾填充'='號,並將標準Base64中的「+」和「/」分別改成了「-」和「_」,這樣就免去了在URL編解碼和資料庫儲存時所要作的轉換,避免了編碼資訊長度在此過程中的增加,並統一了資料庫、表單等處物件識別元的格式。

另有一種用於正規表示式的改進Base64變種,它將「+」和「/」改成了「!」和「-」,因為「+」,「*」以及前面在IRCu中用到的「[」和「]」在正規表示式中都可能具有特殊含義。

此外還有一些變種,它們將「+/」改為「_-」或「._」(用作程式語言中的識別元名稱)或「.-」(用於XML中的Nmtoken)甚至「_:」(用於XML中的Name)。

其他應用[編輯]

  • Mozilla ThunderbirdEvolution用Base64來保密電子郵件密碼
  • Base64也會經常用作一個簡單的「加密」來保護某些資料,而真正的加密通常都比較繁瑣。
  • 垃圾訊息傳播者用Base64來避過反垃圾郵件工具,因為那些工具通常都不會翻譯Base64的訊息。
  • LDIF英語LDAP_Data_Interchange_Format檔案,Base64用作編碼字串。

外部連結[編輯]

參見[編輯]