BASE64编码

BASE64是网络上最常见的用于传输8Bit字节代码的编码方式之一,例如可以将小图片直接编码为BASE64格式直接通过接口传输。

在RFC2045中是这样定义的,BASE64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。

BASE64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6= 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

         例如:

                   转换前 aaaaaabb  ccccdddd  eeffffff   (a,b,c,d,e,f代表0/1)

                   转换后 00aaaaaa  00bbcccc  00ddddee  00ffffff

         上面的三个字节是原文,下面的四个字节是转换后的Base64编码,其前两位均为0。转换后,用一个码表来得到目的字符串(也就是最终的BASE64编码)

 

编码表(RFC2045)

VALUE

ENCODING

VALUE

ENCODING

VALUE

ENCODING

VALUE

ENCODING

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

/

 

         再举一例:

                   转换前 1010110110111010 01110110   

                   转换后 0010101100011011 00101001 00110110

                   十进制 43 27 4154

                   对应码表中的值 r b p2

         所以上面的24位编码,编码后的BASE64值为 rbp2。解码同理,把 rbq2 的二进制位连接上再重组得到三个8位值,得出原码。

         但是原文的字节数量不一定是3的倍数。解决办法是这样的:原文的字节不够的地方可以用全0来补足,转换时BASE64编码用=号来代替。这就是为什么有些BASE64编码会以一个或两个等号结束的原因,但等号最多只有两个。因为:

         所以余数任何情况下都只可能是0,1,2这三个数中的一个。如果余数是0,就表示原文字节数正好是3的倍数。如果是1,为了让BASE64编码是4的倍数,就要补2个等号;同理,如果是2,就要补1个等号。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章