介绍
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节可表示4个可打印字符。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,以及加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,完整的base64定义可见RFC 1421和RFC 2045。编码后的数据比原始数据略长,为原来的4/3(在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%)
why base64
计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同(如:有些字符被当作控制字符处理掉了,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送),这样那些不可见字符就有可能被处理错误,这是不利于传输的。最好的方法就是在不改变传统协议的情 况下,做一种扩展方案来支持二进制文件的传送。把不可打印的字符也能用可打印字符来表示,问题就解决了,Base64编码应运而生,Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法。
应用场景
- 因为早期的一些邮件服务器只支持文本信息,不支持二进制信息和文件。而base64编码后的结果都是纯文本的,适合用电子邮件来传送二进制数据。
- Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。
- 严格来说base64不能算是一种加密,只能说是编码转换。使用base64的初衷,是为了方便把含有不可见字符串的信息用可见字符串表示出来,以便复制粘贴,开发过程中也方便调试和分析
- 一般在网络传输过程,加密后的数据也经常Base64转换一下
编码规则
编码处理流程
- 将字符串转换为ASCII码(实际就是转换字节流,java一般叫byte数组,c语言可以理解为 char 指针指向的内容)
- 将每个字节的ASCII码(实际就是 char 或者 byte)转换为8位二进制形式表示
- 取3字节划分为一组,共24位,将24位分为4组,每组6位,将每6位二进制前补2个0凑足8位(1字节),这样3个字节就变成了4个字节
- 不断进行步骤3直到数据编码完,在编码最后一组,如果不足3字节,补足3字节,如果差一个字节,在编码结果后加1个
=
,如果差2个字节,在编码结果后加2个=