天天看點

關于base64編碼的原理及實作

我們的圖檔大部分都是可以轉換成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” :

關于base64編碼的原理及實作
關于base64編碼的原理及實作

是以,btoa('Tom') = VG9t

b) 字元串長度不能被3整除時,比如“Lucy”:

關于base64編碼的原理及實作
關于base64編碼的原理及實作

由于Lucy隻有4個字母,是以按3個一組的話,第二組還有兩個空位,是以需要用0來補齊。這裡就需要注意,因為是需要補齊而出現的0,是以轉化成十進制的時候就不能按正常用base64編碼表來對應,是以不是a, 可以了解成為一種特殊的“異常”,編碼應該對應“=”。

有了上面的理論,那我們實作一個base64編碼就容易了。

關于base64編碼的原理及實作
關于base64編碼的原理及實作

<a href="http://hongru.github.com/proj/base64/test.html" target="_blank">Base64 example</a>