产生这篇文章的动力在于对接腾讯云服务的时候每次都要进行Base64编码以后才能进行签名,以前只知道Base64是个算法,可是不知道为啥都用这个算法,此次为了连接Base64到底是个什么东东才在网络上各类找资料,把以为对本身有用的记录下来了。java
基本概念和应用场景
Base64是一种基于64个可打印字符来
表示二进制数据
的表示方法。因为2的6次方等于64,因此每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节须要用4个可打印字符来表示。它可用来做为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不一样的系统中而不一样。编码后的数据比原始数据略长,为原来的4/3。
Base64经常使用于在一般处理文本数据的场合,表示、传输、存储一些二进制数据(或不可打印的字符串)。包括MIME的email,email via MIME, 在XML中存储复杂数据.正则表达式在邮件中的用途:
在MIME格式的电子邮件中,base64能够用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来做为后缀用途。算法
在URL中的用途:
标准的Base64并不适合直接放在URL里传输,由于URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还须要再进行转换,由于ANSI SQL中已将“%”号用做通配符。为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的“+”和“/”分别改为了“”和“-”,这样就免去了在URL编解码和数据库存储时所要做的转换,避免了编码信息长度在此过程当中的增长,并统一了数据库、表单等处对象标识符的格式。另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改为了“!”和“-”,由于“+”,“”在正则表达式中均可能具备特殊含义。
因此java.util.Base64类中才会有Encoder和UrlEncoder连个编码和解码器
数据库用记事本打开exe、jpg、pdf这些文件时,咱们都会看到一大堆乱码,由于二进制文件包含不少没法显示和打印的字符,因此,若是要让记事本这样的文本处理软件能处理二进制数据,就须要一个二进制到字符串的转换方法。Base64是一种最多见的二进制编码方法。网络
Base64编码的规则
1.base64是网络上最多见的用于传输8bit字节代码的编码方式之一。
有时咱们须要把二进制数据编码为适合放在URL中的形式。
这时采用base64编码具备不可读性,即所编码的数据不会被人直接看出。
2.用于在http环境下传递较长的标识信息。
base64要求把三个8Bit的字节转换为四个6Bit的字节。
而后把6Bit再添加两位高位0,组成四个8Bit的字节。
也就是说,转换后的长度理论上将要比原来的长1/3.
编码规则:
1.把三个字符变成四个字符。
2.没76个字符加一个换行符。
3.最后的结束符也要处理。
更加详细的算法参见百度百科或者查看jdk8中的java.util.Base64
类的源代码编码
不能用少的长度表示多的数据,不然解码会有不肯定性,为何要把3个8bit变为4个6bit来传输,是由于3*8=4*6
;8bit下最大的就是6bit,因此只能求6和8的最小公倍数。注意:Base64主要是用可打印字符来表示二进制数据,日常说的Base64加密一下是为了防止明文传输数据又为了方便解密而使用的。加密