Base64编码原理
Base64编码是基于64个字符A-Z,a-z,0-9,+,/的编码方式,因为2的6次方正好为64,所以就用6bit就可以表示出64个字符,eg:000000对应A,000001对应B。具体对应关系见下表。
| 字符 | 对应数字 | 字符 | 对应数字 | 字符 | 对应数字 | 字符 | 对应数字 |
|---|---|---|---|---|---|---|---|
| A | 0 | Q | 16 | g | 32 | w | 48 |
| B | 1 | R | 17 | h | 33 | x | 49 |
| C | 2 | S | 18 | i | 34 | y | 50 |
| D | 3 | T | 19 | j | 35 | z | 51 |
| E | 4 | U | 20 | k | 36 | 0 | 52 |
| F | 5 | V | 21 | l | 37 | 1 | 53 |
| G | 6 | W | 22 | m | 38 | 2 | 54 |
| H | 7 | X | 23 | n | 39 | 3 | 55 |
| I | 8 | Y | 24 | o | 40 | 4 | 56 |
| J | 9 | Z | 25 | p | 41 | 5 | 57 |
| K | 10 | a | 26 | q | 42 | 6 | 58 |
| L | 11 | b | 27 | r | 43 | 7 | 59 |
| M | 12 | c | 28 | s | 44 | 8 | 60 |
| N | 13 | d | 29 | t | 45 | 9 | 61 |
| O | 14 | e | 30 | u | 46 | + | 62 |
| P | 15 | f | 31 | v | 47 | / | 63 |
BASE64 的编码原理:都是按字符串长度,以每 3 个 字符(1Byte=8bit)为一组,然后针对每组,首先获取每个字符的 ASCII 编码(字符’a’=97=01100001),然后将 ASCII 编码转换成 8 bit 的二进制,得到一组 3 * 8=24 bit 的字节。然后再将这 24 bit 划分为 4 个 6 bit 的字节,并在每个 6 bit 的字节前面都填两个高位 0,得到 4 个 8 bit 的字节,然后将这 4 个 8 bit 的字节转换成十进制,对照 BASE64 编码表 (上表),得到对应编码后的字符。
ASCII对应关系表
| ASCII码(十进制) | 控制字符 | ASCII码(十进制) | 控制字符 |
|---|---|---|---|
| 65 | A | 97 | a |
| 66 | B | 98 | b |
| 67 | C | 99 | c |
| 68 | D | 100 | d |
| 69 | E | 101 | e |
| 70 | F | 102 | f |
| 71 | G | 103 | g |
| 72 | H | 104 | h |
| 73 | I | 105 | i |
| 74 | J | 106 | j |
| 75 | K | 107 | k |
| 76 | L | 108 | l |
| 77 | M | 109 | m |
| 78 | N | 110 | n |
| 79 | O | 111 | o |
| 80 | P | 112 | p |
| 81 | Q | 113 | q |
| 82 | R | 114 | r |
| 83 | X | 115 | s |
| 84 | T | 116 | t |
| 85 | U | 117 | u |
| 86 | V | 118 | v |
| 87 | W | 119 | w |
| 88 | X | 120 | x |
| 89 | Y | 121 | y |
| 90 | Z | 122 | z |
转化举例
Tom字符串Base64编码
| 字符串 | T | o | m | |
|---|---|---|---|---|
| ASCII | 84 | 111 | 109 | |
| 转化为2进制 | 01010100 | 01101111 | 01101101 | |
| 6位切分 | 010101 | 000110 | 111101 | 101101 |
| 10进制 | 21 | 6 | 61 | 45 |
| Base64字符 | V | G | 9 | t |
ABCD字符串Base64编码
| 字符串 | A | B | C | D | ||||
|---|---|---|---|---|---|---|---|---|
| ASCII | 65 | 66 | 67 | 68 | ||||
| 转化为2进制 | 01000001 | 01000010 | 01000011 | 01000100 | 00000000 | 00000000 | ||
| 6位切分 | 010000 | 010100 | 001001 | 000011 | 010001 | 000000 | 000000 | 000000 |
| 10进制 | 16 | 20 | 9 | 3 | 17 | 0 | 0(异常) | 0(异常) |
| Base64字符 | Q | U | J | D | R | A | = | = |
Base64 python中实现
>>>base64.b64encode(b"ABCD")
b'QUJDRA=='