Base64
base64是一种常用的对二进制数据编码的方式,它可以将任意的数据转换为字符串格式,从而无需担心在网络传输中特殊符号被转换导致数据错误的问题。网页开发中为了减少网络传输次数通常将小尺寸的图片转换纬base64字符串格式直接存储到页面或者打包到js文件中。
base64编码包含a-z、A-Z、0-9、’+’、’/’ 共64个有效字符。其实除了这64个字符以外,我们还经常见到一个或多个’=’字符在base64字符串的末尾,这个特殊的’=’字符是起填充作用的,下面会讲到。
索引
以下是base64转码对应的字符表:
数值 | 字符 | 数值 | 字符 | 数值 | 字符 | 数值 | 字符 |
---|---|---|---|---|---|---|---|
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 | / |
转码原理
base64编码通过将一个8位字节的序列拆分为6位,然后每6位字节对应上面索引表里的一个字符。
例如我们对字符串”abc”进行编码:
原始文本 | a | b | c | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII编码 | 97 | 98 | 99 | |||||||||||||||||||||
二进制位 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
对应索引 | 24 | 22 | 9 | 35 | ||||||||||||||||||||
base64 | Y | W | J | j |
以上是将”abc”三个字符转换为base64编码的过程,经过转换后的字符串长度是之前的4/3倍,比之前多了1/3。
填充
上面示例中的三个字符共24个位,正好能平均分配位每6位的二进制块,正好可转换为4个字符。但有时候字符串的二进制序列不能平均分为6位的二进制块,这时就需要在二进制序列的末尾填充零,使得二进制序列的长度成为6和8的最小公倍数,也就是24的倍数。
- 如果末尾的6个二进制位是部分填充的,那么按照索引表正常转换即可。
- 如果末尾的6个二进制位全部是被填充的话,就转换为特殊符号’=’。
下面示例对单个字符串’a’进行base64编码转换:
- 字符串’a’对应的二进制为 01100001。
- 末尾数据填充,使得长度是24的倍数:01100001 00000000 00000000。
- 切割为6位的数据块: 011000 010000 000000 000000。
- 前两个索引分别为:24、 8,后两个6位是全部填充的数据。
- 前两个对应索引的值为:Y Q,后面填充两个’=’, 最终得到base64编码: ‘YQ==’。
以上就是进行base64编码的过程,还是比较简单的。其实除了base64之外还有base32、base16编码,它们的转换原理是类似的,这里就不再多做介绍。