Base 64 簡(jiǎn)介
Base 64 是一種基于 64 個(gè)可打印字符表示二進(jìn)制數(shù)據(jù)的表示方法。
由于 2^6 = 64,所以每 6 位為一個(gè)單元,對(duì)應(yīng)一個(gè)可打印字符串全释。4 個(gè)可打印字符(Base 64 單元)則對(duì)應(yīng) 3 字節(jié)(24bit = 8 byte)。
它可以用來(lái)傳輸電子郵件中非 ASCII 碼的字符(早期設(shè)計(jì)目的)误债。
但其有著更重要的意義:
- 所有的二進(jìn)制文件浸船,都可以因此轉(zhuǎn)化為可打印的文本編碼,使用文本軟件進(jìn)行編輯
- 能夠?qū)ξ谋具M(jìn)行簡(jiǎn)單的加密
Base 64 常用于一些處理文本數(shù)據(jù)的場(chǎng)合寝蹈,如表示李命、存儲(chǔ)、傳輸一些二進(jìn)制數(shù)據(jù)箫老。(MIME 的電子郵件以及 XML 的一些復(fù)雜數(shù)據(jù)等)
Base 64 轉(zhuǎn)換規(guī)則
以 6 位為一個(gè)單元封字,那么顯然其包括 64 個(gè)字符(大寫字母 A-Z,小寫字母 a-z耍鬓,數(shù)字 0-9阔籽,加號(hào) +,斜杠 / )牲蜀。
傳輸?shù)淖止?jié)數(shù)不一定是3的倍數(shù)笆制,可能最后需要作為后綴的還有一個(gè)等號(hào) = 字符。
轉(zhuǎn)換為 Base 64 后的數(shù)據(jù)比原始數(shù)據(jù)略長(zhǎng)(大約是原來(lái)的 4/3 倍)涣达。
具體規(guī)則如下:
- 每 3 個(gè)字節(jié)(Byte)作為一組在辆,一共 24 個(gè)二進(jìn)制位(bit)。
- 將 24 個(gè)二進(jìn)制位分成 4 組度苔,每組有 6 個(gè)二進(jìn)制位匆篓。
- 每組前面加 2 個(gè) 0x00 ( 8 bit ),擴(kuò)展為 32 個(gè)二進(jìn)制林螃,即 4 個(gè)字節(jié)奕删。
- 按照以下表格俺泣,轉(zhuǎn)為對(duì)應(yīng)的符號(hào)疗认,這就是 Base 64 的編碼值。
/* 0 - 7: 000000 - 000111 */ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
/* 8 - 15: 001000 - 001111 */ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
/* 16 - 23: 010000 - 010111 */ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
/* 24 - 31: 011000 - 011111 */ 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
/* 32 - 39: 100000 - 100111 */ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
/* 40 - 47: 101000 - 101111 */ 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
/* 48 - 55: 110000 - 110111 */ 'w', 'x', 'y', 'z', '0', '1', '2', '3',
/* 56 - 63: 111000 - 111111 */ '4', '5', '6', '7', '8', '9', '+', '/'
舉例說(shuō)明伏钠,以文本 Man 說(shuō)明:
文本 | M | a | n |
---|---|---|---|
ASCII 編碼 | 77 | 97 | 110 |
文本 | 0 | 7 | 0 | 7 | 0 | 7 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
二進(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 |
Base 64 | 0 | 5 | 0 | 5 | 0 | 5 | 0 | 5 |
Base 64 值 | 19(010011) | 22(010110) | 5(000101) | 46(101110) |
---|---|---|---|---|
Base 64 編碼 | T | W | F | u |
傳輸 Base 64 值 | 19(00010011) | 22(00010110) | 5(00000101) | 46(00101110) |
傳出的末尾可能會(huì)多出 1 個(gè)或 2 個(gè)字節(jié)的數(shù)據(jù)(3個(gè)字節(jié)才能對(duì)應(yīng) 4 個(gè) Base 64 單元)横漏。
需要用以下方式處理。
文本(1 Byte) | A(01000001) | 補(bǔ)充的部分(00000000) | 補(bǔ)充的部分(00000000) | |
---|---|---|---|---|
Base 64 編碼 | Q(010000) | Q(010000) | = (000000) | = (000000) |
文本(1 Byte) | B(01000010) | C(01000011) | 補(bǔ)充的部分(00000000) | |
---|---|---|---|---|
Base 64 編碼 | Q(010000) | k(100100) | M(001100) | = (000000) |
末尾的 000000 采用 = 符號(hào)
用于 URL 的改進(jìn) Base 64 編碼
URL 傳輸對(duì)于 =熟掂,+缎浇,/ 字符都有其特殊的用意(用于 URL 編解碼和數(shù)據(jù)庫(kù)存儲(chǔ)時(shí)),使用標(biāo)準(zhǔn) Base 64 現(xiàn)在回帶來(lái)轉(zhuǎn)換的麻煩赴肚。
針對(duì) URL 的改進(jìn) Base 64 編碼則是不在末尾填充 = 號(hào)素跺,且把 + 號(hào)改成 -二蓝,/ 號(hào)改成 _。
用于正則表達(dá)式的改進(jìn) Base 64 變種
+ 改為 ! (在正則表達(dá)式有特殊含義)
/ 改為 - (在正則表達(dá)式有特殊含義)
還有 *+/ * 改為 _- 或 ._ (用作編程語(yǔ)言中的標(biāo)識(shí)符名稱)或 .- (用于 XML 中的Nmtoken)或 _:(用于 XML 中的Name)