前段时间看到项目前端框架中的上传文件部分用到了 base64 。记得上大学时曾在网络原理的书中看到这个玩意,当初以为是用来加密的,也就没有深究。而如今又遇到,不去揭开它的神秘的面纱,心里特别难受。下面就来一步步揭开 base64 的面纱。
什么是 base64 ?
- 首先 base64 并不是用来加密数据的。可能有时候我们会说 base64 加密解密,但是这里的加密解密更确切的说应该是编码和解码。说白了 base64 就是个编码算法。
base64 编码的作用?
- 在我们的计算机中所有数据都是按 ascii 码存储的,而 ascii 码的128~255之间的值时不可见字符。在网络上交换数据时,比如小明同学准备将收藏多年的资源分享给大明,从资源被小明上传到大明下载资源,这期间这份资源要经过多个路由设备,而不同的路有设备对字符的处理方式会有些不同,比如一些不可见字符可能会被错误处理了,这样小明的资源可能就到不了大明那里或者大明下了资源后发现资源根本无法打开。为了大明能够接收到一份完整的资源,我们就要先对资源数据进行一次 base64 编码,让不可见字符都变成可见字符,这样可以最大程度的确保资源在传输过程中不出错。
base64 原理?
这里用一个例子(对字符串 ATaBCD 进行 base64 编码)来解开 base64 的面纱。
- 首先先对字符串按照三个字节作为一个组分割,这样就得到了两个字符串(ATa(01000001,01010100,01100001),BCD)。每组有24位。(ps:一个字符=一个字节=8位)
- 将每一组按6位分割为一组。这里只对ATa进行分割。(010000,010101,010001,100001)
- 给分好的4组,每组加两位前导0,这样我们就得到了4个字节的数据。(00010000,00010101,00010001,00100001)
- 最后根据 base64 编码表将对应字节进行编码替换,替换后的结果就是编码值了。(ATa 经过 base64 编码后的结果就是 QVRh 了)
base64 编码图:
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
- 如果字符串只有两个字符或者一个字符那么该如何编码?
比如将字符串 AT 进行 base64 编码。
- 首先还是按每组6为进行分割(010000,010101,0100)
- 每组还是添加2个前导0,但是第三组末尾还要加2个0。(00010000,00010101,00010000)
- 这样对应的编码值就是QVQ,但是我们还少了一个字节,我们就规定用“=”替代这个字节,最终的编码值就是 QVQ=
- 如果对字符串 A 进行 base64 编码:
- (010000,01)
- 添加2个前导0,第二组添加4个后缀0(00010000,00010000)
- 得到编码值为QQ,我们需要用2个“=”将编码值补全成四个字节。最后的编码值为 QQ==
所以这样看来,base64 也就是很普通的一个字符串编码算法而已,连我们都能做一套属于自己的 base64 编码算法了。
Comments