网上关于Base64编解码原理的资料已经很多了,这里只是自己梳理一下知识点而已。如有不确,望批评指正。
概念:
Bas64编码顾名思义,就是用64个可显示字符来显示二进制的编码方式。64个字符正好需要6个bit位来编码,也就是说Base64每6bit作为一个单元。4*6=24个bit正好是3个byte。所以,Base64都是每3个字符进行编码最终结果为4个可显示Base64字符。当需要编码的字符不能被3整除时,用 0 来填充,每填充 00 ,则最终结果就会加一个 = ( 其中 = 号只是一个编码后缀不属于64个可显示字符)。
Base64编码表对应的64个字符包括:0-25->A-Z;26-51->a-z ;52-61->0-9;62为 +;63为 \ 。如下:
Base64 编码表 | |||||||
---|---|---|---|---|---|---|---|
Value | Char | Value | Char | Value | Char | Value | Char |
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 | |
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 | / |
原理:
(一)编码:
取字符ASCII的十进制表示(每3个字符为一组),然后将十进制转化为二进制。从左边开始每6个bit组成一个新的单元(连续4个单元组成新的一组,共24bit),不够的用0补齐。每6bit转化为一个十进制,查找Base64编码表,找到相对应的字符。组合到一块完成编码。编码过程中末尾每加2个0则最后Base64编码加一个 = 。
(二)解码
解码是编码的反向操作,先根据字符在Base64编码表找到对应的十进制数。将十进制数转化为二进制表示,源编码后面若有一个 =,则在二进制后面去掉 00 ;若编码后面有两个 = ,则在二进制后面去掉两个 00 。然后从左往右每8个bit组成一个新的byte,将其转化成十进制数。最后,根据该十进制数查看ASCII编码表,找到对应的字符,完成解码。
下面举例说明:
Base64编码:
1)字符个数为3个整数倍。例如:”RFC“
字符 | R | F | C | |
ASCII十进制 | 82 | 70 | 67 | |
8bit | 01010010 | 0100 0110 | 0100 0011 | |
6bit | 010100 | 100100 | 011001 | 000011 |
十进制 | 20 | 36 | 25 | 3 |
Base64 | U | k | Z | D |
2)字符个数被3除余数为1。例如:”Base“
字符 Base
ASCII中的十进制表示6697 115 101
8bit表示 0100 0010 0110 00010111 00110110 0101
6bit表示 010000 100110 000101 110011 011001 010000 (注:此处补了4个0)
十进制表示 16 38 55125 16
Base64编码 Q m FzZ Q = =
3)字符个数被3除余数为2。例如:”Basee“
字符 Bas e e
ASCII中的十进制表示6697 115 101 101
8bit表示 0100 0010 0110 00010111 00110110 01010110 0101
6bit表示 010000 100110 000101 110011 011001 010110 010100 (注:此处补了2个0)
十进制表示 16 38 55125 22 20
Base64编码 Q m FzZ W U =
Base64解码:
1)编码不带 = 号。例如:“UkZD”
Base64编码Uk Z D
十进制表示2036 25 3
6bit表示010100100100011001000011
8bit表示0101 00100100 01100100 0011
ASCII十进制表示8270 67
字符 RF C
2)编码带有一个 = 号。例如:“QmFzZWU=”
Base64编码Qm F z ZWU =
十进制表示1638 5 51 252220
6bit表示010000100110000101110011011001010110010100
8bit表示0100 00100110 00010111 00110110 01010110 0101
ASCII十进制表示6697 115 101 101
字符Ba s e e
3)编码带有两个 = 号。例如:“QmFzZQ==”
Base64编码QmFzZQ==
十进制表示16385512516
6bit表示010000100110000101110011011001010000
8bit表示0100 00100110 00010111 00110110 0101
ASCII十进制表示6697115101
字符Base
注:等号只是编码后缀,它是不算在编码里面的。