前言
本文主要用于记录 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 个字符是由于其太相似了容易搞混,最后去除 +、\ 是由于不方便双击复制文本。