Base16,Base32,Base64编码的介绍

简介

在网络传入字符串过程中,如果编码方式是基于ASCII,那么会造成什么问题?比如:url地址中存在"/"(如:www.csdn.net/nav/ai),字符串中编码中也存在"/",这样就会出现错误地址解析.为了防止这种情况的出现,出现了Base16,Base32,Base64编码方式.我们知道计算机传输的单位是字节,也就是8个比特位,按照一个字节编码的方式结果就有256种状态(每个比特位0或者1两种状态,8位就是2^{8}=256),ASCII编码是将8个比特位中最高位置为0,所以总共可表示128个字符(即2^{7}=128).为了避免冲突,去掉一些特殊字符,重新编码.例如Base16编码,编码后的字符只会在(0~9,A~F)中,Base32编码后字符就会在(A~Z, 2~7)中以及填充符"="中出现.

Base16编码

Base16编码就是将ASCII字符集中可打印的字符(数字0~9和字母A~F)对应的二进制字节数据进行编码,编码的方式:

1.将数据(根据ASCII编码,UTF-8编码等)转成对应的二进制数,不足8比特位高位补0.然后将所有的二进制全部串起来,4个二进制位为一组,转化成对应十进制数.

2.根据十进制数值找到Base16编码表里面对应的字符.Base16是4个比特位表示一个字符,所以原始是1个字节(8个比特位)刚好可以分成两组,也就是说原先如果使用ASCII编码后的一个字符,现在转化成两个字符.数据量是原先的2倍.

                                                                                        Base16编码表

案例:将"ILU"字符串,根据ASCII编码得到对应的二进制,将所有二进制串起来,然后按4个二进制位分割,转化成十进制数值,根据Base16编码表得到编码"494C55",编码后的数据是原先的2倍.

文本

I

L

U

ASCII编码

73

76

85

二进制位

0

1

0

0

1

0

0

1

0

1

0

0

1

1

0

0

0

1

0

1

0

1

0

1

十进制数值

4

9

4

12

5

5

Base16编码

4

9

4

C

5

5

Base32编码

与Base16编码区别的是,Base32使用了ASCII编码中可打印的32个字符(大写字母A~Z和数字2~7)对任意字节数据进行编码.Base32将串起来的二进制数据按照5个二进制位分为一组,由于传输数据的单位是字节(即8个二进制位).所以分割之前的二进制位数是40的倍数(40是5和8的最小公倍数).如果不足40位,则在编码后数据补充"=",一个"="相当于一个组(5个二进制位),编码后的数据是原先的\frac{8}{5}倍.

                                                                                             Base32编码表

案例:"ILU"字符串根据Base32编码进行编码,先根据ASCII编码得到对应字符编码值以及对应二进制,将所有二进制串起来,然后按照5个二进制位为一组分割 ,得到十进制值=>找到Base32编码表找到对应的字符.案例总共分割成了5组(25位),还差三组(15位).在末尾补充3个"=".经过Base32编码后最终值应是"JFGFK===".

文本

I

L

U

ASCII编码

73

76

85

二进制位

0

1

0

0

1

0

0

1

0

1

0

0

1

1

0

0

0

1

0

1

0

1

0

1

十进制数值

9

5

6

5

10

Base32编码

J

F

G

F

K

Base64编码

Base64编码使用了ASCII编码中64个可打印的字符(大写字母A~Z,小写字母a~z,数字0~9以及"+","/")将任意字节数据进行编码.Base64编码将串起来的二进制以6位进行分割.所以分切之前的二进制位数应该是24的倍数(即6,8的最小公倍数).如果不足24位,则在编码后数据后面添加"=",一个"="想当于6个二进制位.数据量是原先的\frac{4}{3}倍.

                                                                                           Base64编码表

案例:"ILU"字符串编码,前面的过程与Base16编码,Base32编码一样,区别是将串起来的二进制按6位分为一组.得到4组(24位).所以末尾不用补充"=",所以经过Base64编码后的结果是"SUxV".

文本

I

L

U

ASCII编码

73

76

85

二进制位

0

1

0

0

1

0

0

1

0

1

0

0

1

1

0

0

0

1

0

1

0

1

0

1

十进制数值

18

20

49

21

Base64编码

S

U

x

V

总结

1.Base16编码是包含了数字(0~9)和大写字母(A~F),Base32编码与Base64编码最大区别是前者没有小写字母.Base32编码可以用于文件系统的名称(不区分大小情况).而Base64编码后数据量相比原先不是增加很多,可以用于网络传输.(比如下载链接)