相關(guān)文章:
Base64 之 JavaScript 實現(xiàn)
在Web前端還可以這樣實現(xiàn)Base64
什么是Base64
下面一段引用百度百科的介紹,不知道你看后會有什么感想磕瓷,反正當初我剛接觸Base64時是沒看明白它在說什么儡遮。
Base64是網(wǎng)絡上最常見的用于傳輸8Bit字節(jié)代碼的編碼方式之一奋岁,大家可以查看RFC2045~RFC2049嚼酝,上面有MIME的詳細規(guī)范妄均。Base64編碼可用于在HTTP環(huán)境下傳遞較長的標識信息毙驯。例如倒堕,在Java Persistence系統(tǒng)Hibernate中,就采用了Base64來將一個較長的唯一標識符(一般為128-bit的UUID)編碼為一個字符串爆价,用作HTTP表單和HTTP GET URL中的參數(shù)垦巴。在其他應用程序中媳搪,也常常需要把二進制數(shù)據(jù)編碼為適合放在URL(包括隱藏表單域中的形式。此時骤宣,采用Base64編碼具有不可讀性秦爆,即所編碼的數(shù)據(jù)不會被人用肉眼所直接看到。
下面這段是給出我的理解憔披,當然要看懂下面這段等限,你需要掌握一些非常基礎(chǔ)的計算機技術(shù)常識活逆,如:一個字節(jié)是8bits(8位)等精刷。
Base64編碼要求把3個8位字節(jié)(3x8=24)轉(zhuǎn)化為4個6位的字節(jié)(4x6=24),因為在計算機中蔗候,一個字節(jié)是8bits所以需要在編碼后的6位的前面補兩個0怒允,形成8位一個字節(jié)的形式。 在對一個串(可能是字符串锈遥,也可以是二進制串)進行Base64編碼的過程中纫事,如果最后剩下的串不足3個字節(jié),則用0填充所灸,輸出字符使用'='丽惶,因此編碼后輸出的文本末尾可能會出現(xiàn)1或2個'='。
為了保證所輸出的編碼是可讀字符爬立,Base64制定了一個編碼表钾唬,以便進行統(tǒng)一轉(zhuǎn)換。編碼表的大小為2^6=64侠驯,這也是Base64名稱的由來抡秆。
我曾把Base64編碼理解成64進制(把陌生概念映射到熟悉的領(lǐng)域幫助理解),但Base64編碼與64進制不完全一樣吟策。
編碼規(guī)則
- 把3個字符變成4個字符儒士。
- 每76個字符加一個換行符。
- 最后的結(jié)束符也要處理檩坚。
Base64要求把每三個8Bit的字節(jié)轉(zhuǎn)換為四個6Bit的字節(jié)(3x8 = 4x6 = 24)着撩,然后把6Bit再添兩位高位0,組成四個8Bit的字節(jié)匾委,也就是說拖叙,轉(zhuǎn)換后的字符串理論上將要比原來的長1/3。
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 | / |
編碼過程
這里僅舉一個ASCII碼編碼過程的例子赂乐。針對UTF-8或圖片等的編碼過程與之類似憋沿,只是把對應的 轉(zhuǎn)成ascii 和 轉(zhuǎn)換成2進制 這兩步替換成其他對應的步驟,只要能得到一個2進制串就行了沪猴。
首先把原理的公式列一下: 3x8=4x6
內(nèi)存1個字符占8位
轉(zhuǎn)前: a 4 9
先轉(zhuǎn)成ascii:對應 97 52 57(只有ascii字符才會這樣操作)
轉(zhuǎn)成2進制: 01100001 00110100 00111001
6個一組(4組) {011000}{010011}{010000}{111001}
然后才有后面的 011000 010011 010000 111001
然后計算機是8位8位的存數(shù) 6不夠辐啄,自動就補兩個高位0了
所以有了 高位補0得到:00011000 00010011 00010000 00111001
轉(zhuǎn)成十進制得到: 24 19 16 57
查表得到 Y T Q 5
Base64 編碼的擴展
Base64 在 URL 中的擴展
標準的Base64并不適合直接放在URL里傳輸采章,因為URL編碼器會把標準Base64中的“/”和“+”字符變?yōu)樾稳纭?XX”的形式,而這些“%”號在存入數(shù)據(jù)庫時還需要再進行轉(zhuǎn)換壶辜,因為ANSI SQL中已將“%”號用作通配符悯舟。
為解決此問題,可采用一種用于URL的改進Base64編碼砸民,它在末尾填充'='號抵怎,并將標準Base64中的“+”和“/”分別改成了“-”和“_”,這樣就免去了在URL編解碼和數(shù)據(jù)庫存儲時所要作的轉(zhuǎn)換岭参,避免了編碼信息長度在此過程中的增加反惕,并統(tǒng)一了數(shù)據(jù)庫、表單等處對象標識符的格式演侯。
Base64在正則表達式中的擴展
用于正則表達式的改進Base64姿染,它將“+”和“/”改成了“!”和“-”,因為“+”,“*”在正則表達式中都具有特殊含義秒际。