Base64编码原理

在计算机中,所有的数据在存储和运算时都要使用二进制数表示,为了保证大家互相通信,统一用ASCII编码来约束常用符号用哪些二进制数字来表示;Base64主要用于将不可打印的字符转换成可打印字符,或者简单地说将二进制数据编码成ASCII字符,通常用于处理文本数据的场合,包括MIME的电子邮件及XML的一些复杂数据

Base64最早是用在邮件传输协议中的,原因是邮件传输协议只支持ASCII字符传递,因此如果要传输二进制文件(如图片,视频)是无法实现的.因此Base64就可以用来将二进制文件内容编码为只包含ACII字符的内容,这样就可以传输了,但是这样的话,文件只存会比原来增加1/3,具体见如下编码原理

编码原理:

Base64是一种基于64个可打印来表示二进制数据的表示方法,由于2^6=64,所以每6个bit是一个单位,3个字节(一个字节8bit)有24个bit,对应4个Base64单元,即3个字节可由4个可打印字符来表示

Base64编码过程:
  1. 按字符串长度,以每3个8bit的字符为一组;
  2. 针对每组,获取每个字符的ASCII编码值;
  3. 将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节;
  4. 再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节;
  5. 将这4个8bit的字节转换成10进制,对照Base64编码表,得到对应编码后的字符.
    Base64编码age

其中如果数据不足3字节的话,则剩余的bit空白用0补足;
若数据长度不是3的倍数且只剩下2个输入数据,则在编码结果后加1个=;
2个字节

若数据长度不是3的倍数且只剩下1个输入数据,则在编码结果后加2个=;
这里写图片描述

标准ASCII码使用7位二进制数(剩下的1位二进制为0)来表示128中可能的字符;其中0~32位及第127位为控制字符;33~127为可打印字符
ASCII编码表

Base64包括字符A-Z,a-z,数字0-9,此外两个可打印字符在不同系统中而不同
Base64编码表

Base64.URL_SAFE

/**
* Encoder/decoder flag bit to indicate using the “URL and
* filename safe” variant of Base64 (see RFC 3548 section 4) where
* {@code -} and {@code _} are used in place of {@code +} and
* {@code /}.
*/
标准Base64不适合直接放在URL里进行传输,因为URL编码器会吧标准Base64中的/和=字符变成形如%XX的形式,而这些%号在存入数据库时还需要再进行转换,为此,引入了一种用于URL的改进Base64编码(android中flag=Base64.URL_SAFE)它不在末尾填充=,并将标准Base64中的+和/分别改成了-和_

备注:ASCII 和Base64编码表引用于网络https://segmentfault.com/a/1190000012203024

猜你喜欢

转载自blog.csdn.net/dzkdxyx/article/details/80208221