我們的圖檔大部分都是可以轉換成base64編碼的data:image。 這個在将canvas儲存為img的時候尤其有用。雖然除ie外,大部分現代浏覽器都已經支援原生的基于base64的encode和decode,例如btoa和atob。(将canvas畫布儲存成img并強制改變mimetype進行下載下傳,會在下一篇記錄)
但是處于好奇心,還是驅使我去了解下base64編碼的原理。以便也在不支援原生base64編碼的ie下可以得以實作。
【Base64】
-base64的編碼都是按字元串長度,以每3個8bit的字元為一組,
-然後針對每組,首先擷取每個字元的ASCII編碼,
-然後将ASCII編碼轉換成8bit的二進制,得到一組3*8=24bit的位元組
-然後再将這24bit劃分為4個6bit的位元組,并在每個6bit的位元組前面都填兩個高位0,得到4個8bit的位元組
-然後将這4個8bit的位元組轉換成10進制,對照Base64編碼表 (下表),得到對應編碼後的字元。
(注:1. 要求被編碼字元是8bit的,是以須在ASCII編碼範圍内,\u0000-\u00ff,中文就不行。
2. 如果被編碼字元長度不是3的倍數的時候,則都用0代替,對應的輸出字元為=)
Base64 編碼表
Value
Char
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
5
F
21
V
37
l
53
6
G
22
W
38
m
54
7
H
23
X
39
n
55
8
I
24
Y
40
o
56
9
J
25
Z
41
p
57
10
K
26
a
42
q
58
11
L
27
b
43
r
59
12
M
28
c
44
s
60
13
N
29
d
45
t
61
14
O
30
e
46
u
62
+
15
P
31
f
47
v
63
/
比如舉下面2個例子:
a) 字元長度為能被3整除時:比如“Tom” :
是以,btoa('Tom') = VG9t
b) 字元串長度不能被3整除時,比如“Lucy”:
由于Lucy隻有4個字母,是以按3個一組的話,第二組還有兩個空位,是以需要用0來補齊。這裡就需要注意,因為是需要補齊而出現的0,是以轉化成十進制的時候就不能按正常用base64編碼表來對應,是以不是a, 可以了解成為一種特殊的“異常”,編碼應該對應“=”。
有了上面的理論,那我們實作一個base64編碼就容易了。
<a href="http://hongru.github.com/proj/base64/test.html" target="_blank">Base64 example</a>