为什么要有Base64,它解决什么问题?
Base64是一种编码格式,用于将不可读的二进制转换为可读的字符。Base64,这个名字取的很直观,就是基于64个字符的二进制转换。这64个字符是[A-Za-z0-9+/],刚好64个。
我们知道,一个byte是占8 bit,用8bit可以表示出2^8 = 256个值,这里才64个字符,不够表示的啊。别急,这就需要做一次转换了,简而言之,就是把3个byte扩展成4个byte。
3 byte = 24 bit,把24bit分为4个单元,每个单元为6bit,2^6 = 64,64个字符刚好可以用完。
比如"hello world",如果我们要用Base64编码应该怎么表示?
简单起见,拿前3个字符来举例,一个字符占一个byte
- "hel"的ASCII编码转换成十进制是
104
,101
,108
, 转换成二进制就是01101000
,01100101
,01101100
- 将这24个bit分成4个单元,
011010
,000110
,010101
,101100
- 每个单元前面补齐两个0,就是
00011010
,00000110
,00010101
,00101100
,对应十进制就是26
,6
,21
,44
- 对应下表的字符,就是aGVs
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y
如果一串二进制不够3byte整除怎么办? 比如"h"这个字符,变成Base64编码应该是什么?
- h的ASCII二进制是
01101000
- 因为原始字符只有1byte,只能分两个6bit的单元,不要紧,先分。
011010
,00 0000
还差2byte - 将每个单元补齐两个0,就是
00011010
,00000000
,还差2byte - 转换为aA,还差两个字节,用等号(=)代替,就是aA==
刚才我们用String的byte数组说明了Base64编码,这无疑有点多此一举,本身String就是ASCII编码可见的啊。但除了String字符之外,在计算机世界所有的东西都是用二进制表示的,如一个图片,一个流媒体,都是用二进制表示,这些资源就可以通过base64来达到像字符一样的可读效果了,只不过被base64编码的字符串其实也没啥语义上的可读性。
网友评论