基本介绍
base64是一种编码方式,并不是加密,它总共的字符集合包括64个可打印字符(a-z、A-Z、0-9、+、/)加一个=,任何一段二进制字节流都可以被这65个字符编码。
标准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 |
工作方式
将数据按不同编码格式(如utf-8)转换成二进制字节流,然后按每6个二进制位为一组,分成若干组,如果流的总位数不是6的倍数,则最后一组低位补0。之后每6位组成一个新的字节,高位补00,按分组顺序重新组成一个流,最后根据base64索引表中的值找到对应的字符替换。
这样的话,如果字符串长度刚好为3的倍数,则恰好能转成 4的倍数字节的base64格式。
但是,如果字符串长度不是3的倍数,则转换的base64格式也不是4的倍数字节,则需要保证转换后的字节数为4的倍数,所以需要在转换后的字符后面补上"=",使其长度为4的倍数。
示例
例如现在有一个字符串"hello,world",转成二进制流如下表,共88个比特。
字符 | 二进制位 | 字符 | 二进制位 |
h | 01101000 | w | 01110111 |
e | 01100101 | o | 01101111 |
l | 01101100 | r | 01110010 |
l | 01101100 | l | 01101100 |
o | 01101111 | d | 01100100 |
, | 00101100 |
按6位一组分组,高位补00,且最后一组低位也补00,这一步得出结果为15个字节,之后再用"="补齐使字符串长度为4的倍数字节,得到新的序列如下为aGVsbG8sd29ybGQ=,长度为16字节,如下表所示:
二进制位 | 字符 | 二进制位 | 字符 |
00011010 | a | 00011101 | d |
00000110 | G | 00110110 | 2 |
00010101 | V | 00111101 | 9 |
00101100 | s | 00110010 | y |
00011011 | b | 00011011 | b |
00000110 | G | 00000110 | G |
00111100 | 8 | 00010000 | Q |
00101100 | s | = |