【Base64】
-base64的編碼都是按字符串長(zhǎng)度,以每3個(gè)8bit的字符為一組,
-然后針對(duì)每組,首先獲取每個(gè)字符的ASCII編碼,
-然后將ASCII編碼轉(zhuǎn)換成8bit的二進(jìn)制,得到一組3*8=24bit的字節(jié)
-然后再將這24bit劃分為4個(gè)6bit的字節(jié),并在每個(gè)6bit的字節(jié)前面都填兩個(gè)高位0,得到4個(gè)8bit的字節(jié)
-然后將這4個(gè)8bit的字節(jié)轉(zhuǎn)換成10進(jìn)制,對(duì)照Base64編碼表 (下表),得到對(duì)應(yīng)編碼后的字符。
(注:1. 要求被編碼字符是8bit的,所以須在ASCII編碼范圍內(nèi),\u0000-\u00ff,中文就不行。
2. 如果被編碼字符長(zhǎng)度不是3的倍數(shù)的時(shí)候,則都用0代替,對(duì)應(yīng)的輸出字符為=)
比如舉下面2個(gè)例子:
a) 字符長(zhǎng)度為能被3整除時(shí):比如“Tom” :
? ? ? ? ? ? ? ? ?T ? ? ? ? ? ? ? ? ? ? ?o ? ? ? ? ? ? ? ? ? ?m
ASCII: ? ? 84 ? ? ? ? ? ? ? ? ? 111 ? ? ? ? ? ? ? 109
8bit字節(jié):01010100 ? 01101111 ? 01101101
6bit字節(jié):010101 ? 000110 ? 111101 ? 101101
十進(jìn)制: ? ? ?21 ? ? ? ? ? ? 6 ? ? ? ? ? ? ?61 ? ? ? ? ? ?45
對(duì)應(yīng)編碼: ? ?V ? ? ? ? ? ? ?G ? ? ? ? ? ? ?9 ? ? ? ? ? ? ? t
所以,btoa('Tom') = VG9t
b) 字符串長(zhǎng)度不能被3整除時(shí),比如“Lucy”:
? ? ? ? ? ? ? ? L ? ? ? ? ? ? ? ? ?u ? ? ? ? ? ? ? ? ?c ? ? ? ? ? ? ? ? ?y
ASCII: ? ?76 ? ? ? ? ? ? ? 117 ? ? ? ? ? ? ? 99 ? ? ? ? ? ? ?121
8bit字節(jié):01001100 ?01110101 ?01100011 ?01111001 ?00000000 ?00000000 ? (必須要用0把字節(jié)數(shù)湊成3的倍數(shù))
6bit字節(jié):010011 ? 000111 ? 010101 ? 100011 ? 011110 ? 010000 ? 000000 ? 000000
十進(jìn)制: ? ? ?19 ? ? ? ? ? ? ?7 ? ? ? ? ? ? ?21 ? ? ? ? ? ? 35 ? ? ? ? ? 30 ? ? ? ? ? ?16 ? ? ? ? ?(異常) ? ? (異常)
對(duì)應(yīng)編碼: ? ?T ? ? ? ? ? ? ?H ? ? ? ? ? ? ? V ? ? ? ? ? ? ? ?j? ? ? ? ? ? ? e ? ? ? ? ? ? ? Q ? ? ? ? ? ? = ? ? ? ? ? ? ?=
所以,btoa('Lucy') = THVjeQ==
由于Lucy只有4個(gè)字母,所以按3個(gè)一組的話,第二組還有兩個(gè)空位,所以需要用0來(lái)補(bǔ)齊。這里就需要注意,因?yàn)槭切枰a(bǔ)齊而出現(xiàn)的0,所以轉(zhuǎn)化成十進(jìn)制的時(shí)候就不能按常規(guī)用base64編碼表來(lái)對(duì)應(yīng),所以不是a, 可以理解成為一種特殊的“異?!保幋a應(yīng)該對(duì)應(yīng)“=”。
有了上面的理論,那我們實(shí)現(xiàn)一個(gè)base64編碼就容易了。

