天天看点

Base64编码原理解析

网上关于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
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

注:等号只是编码后缀,它是不算在编码里面的。

继续阅读