Base64 编码

前言

本文主要用于记录 Base64 编码的基本概念、原理以及其在实际开发中的作用。

基本概念

Base64 编码算法是用于将二进制数据转换成由 64 个可读字符组成的字符串的编码算法,长度不定。

注1:编码的定义为将数据从一种格式转换为另一种格式,并且还能转换为原格式的一种转换方式。

注2:广义上的二进制数据,表示的是任何计算机的数据,狭义上的二进制数据表示的是除文本以外的所有数据比如:图片、音乐、视频等。对于 Base64 编码而言其代表的是广义的。

注3:64 个字符分别是 A ~ Z、a ~ z、0 ~ 9、+、/ 。

编码原理

Base64 编码会将中的二进制数据每六位替换为一个字符,比如原文为 Man,其对应 3 个字节,如下图:

文本 M a n
ASCII编码 77 97 110
二进制位 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
索引 19 22 5 46
Base64编码 T W F u

那么为什么 19 就对应于 T、22 就对应于 W 呢?其实它拥有一个码表,根据码表一一替换,如下图:

数值 字符   数值 字符   数值 字符   数值 字符
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 /

不过这只是在一般情况下,如果要编码的字节数不能被 3 整除,最后会多出 1 个或 2 个字节,这时候的处理方式为先使用 0 补足,使其能够被 3 整除,然后再进行 Base64 的编码。在编码后的Base64文本后加上一个或两个 = 号,代表补足的字节数,如下图所示:

文本(1 Byte) A
二进制位 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
二进制位(补0) 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Base64编码 Q Q = =
文本(2 Byte) B C
二进制位 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0
二进制位(补0) 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0
Base64编码 Q k M =

很明显如果原字节数与 3 的模为 1,也就是多余 8 位,Base64 会将其补足 24 位,因此最终会多两个 = 号,如果模为 2,也就是多余 16 位 Base64 将其补足 24 位,因此最终会多一个 = 号。

基本用途

用于在只能接收文本信息的地方传输二进制数据,比如客户端通过 WebView 传输视频给 H5,或者 IM 聊天发送图片给对方(也可以客户端先上传图片再发送 url 给对方)。

性能对比

Base64 编码不提供安全性,因为算法是固定的,人人都可以获取到源数据。

Base64 编码是低效的,只在非用不可的情况下使用,原因是其将 3/4 个字节转换为 1 个字节,增加了传输成本以及运算成本。

扩展知识

Base64 编码还有一个相近的编码那就是 Base58 编码主要用于生成比特币的钱包地址,其去除了 O、0、I、l、+、\,其中前面 4 个字符是由于其太相似了容易搞混,最后去除 +、\ 是由于不方便双击复制文本。

0%