一.作用
Base64就是一种基于64个可打印字符来表示二进制数据的方法,把一些不可打印的字符转换成全部都是可打印的字符。
ps:关于ASCII编码(含扩展ASCII)中,打印字符和不可打印字符:https://blog.csdn.net/MrYushiwen/article/details/107998062
二.base64编码转换表(64个可打印字符)
总共64个可打印字符,从0开始到63结束。
三.base64举例说明全过程
1.规则
关于这个编码的规则:
- 把3个字节变成4个字节,6位为一组,高位补两个0,组成一个字节,这样十进制中正好从0到63
- 每76个字符加一个换行符。
- 最后的结束符也要处理。
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
2.举例一(末尾没有=
号)
把UTF-8编码的abc
进行base64编码其具体过程如下:
- UTF-8编码的
abc
其底层用二进制表示为01100001 01100010 01100011
- 拆分,每六位一组:
011000 010110 001001 100011
- 高位补两个0:00
011000
,00010110
,00001001
, 00100011
- 查找base64编码转换表,00
011000
,00010110
,00001001
, 00100011
十进制为:24,22,9,33,对于的字符为:YWJj
2.举例二(末尾有=
号)
在1中的规则,第一条对于这个有稍微的变化,因为这个末尾差分6个为一组时,最后只有4个,怎么办呢,先低位补0,补成6位,然后在高位补两个0,组成一个字节,这样十进制中正好从0到63
把UTF-8编码的ab
进行base64编码其具体过程如下:
- UTF-8编码的
ab
其底层用二进制表示为01100001 01100010
- 拆分,每六位一组,末尾只有4位,先低位补0,补成6位:
011000 010110 0010
00 - 高位补两个0:00
011000
,00010110
,000010
00 - 查找base64编码转换表,00
011000
,00010110
,000010
00 十进制为:24,22,8对于的字符为:YWI
- 在举例1中字节数量应该是3的倍数,如果这个条件不能满足的话,具体的解决办法是这样的:剩余的字节根据编码规则继续单独转过程如上述所述,最后再用=号补满4个字节。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。因为一个原字节至少会变成两个目标字节,所以余数任何情况下都只可能是0,1,2这三个数中的一个。如果余数是0的话,就表示原文字节数正好是3的倍数(最理想的情况)。如果是1的话,转成2个Base64编码字符,为了让Base64编码是4的倍数,就要补2个等号;同理,如果是2的话,就要补1个等号。
- 补一个
=
号,最后结果为:YWI=
四.关于URL的改进Base64编码
- 标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
- 为解决此问题,可采用一种用于URL的改进Base64编码,它在末尾填充’='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,即把
二.base64编码转换表(64个可打印字符)
中的62和63对应的字符改成了-
和_
- 这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。