主要条件与前情
1.一个字节占8位,
2.ASCII码总共有128个,包括了特殊字符以及0~9,a~z,A~Z
3.网络传输过程中,一些特殊字符无法进行传输,通常只可以传输0~9,a~z,A~Z,+,/
4.Base64的设计,是为了将无法通过传输传输协议的字符,变为可传输字符。
下图为Base64编码对应图:
编码包括0~9,a~z,A~Z,+,/,全部为可传输字符。
1个转码后的字符 只需会占用6位,2的6次方正好等于64,足够表示BASE64全部字符
3个转码前字符,总的占用(3*8)=24位
Base的做法就是:
以3个转码前的字符为一组,输出4个转码后的字符
给的字符不足3个的时候,进行补=占位
如果2个字符就补足”=”
如果1个字符就补足”==”
通过移位操作将空间24位空间占满
最终替换特殊字符,解决传输问题。
具体转码一组(3字符)的移位操作如下:
获得转码后的第一个字符:
字符"M"占8位,需要取其前6位,
M的二进制为:01001101 右移两位(>>2)
010011.01--省去小数->010011=19
对照Base64编码表,第19个编码为T
获得转码后的第二个字符:
第二个字符,则由M的后2位,与a的前4位组成一个字符
获取M的后2位:(char3[0] & 0x03) << 4 01
获取a的前4位:(char3[1] & 0xf0) >> 4 0110
组合成 0100110=22
对照Base64编码表,第22个编码为W
顺带解释一下:(&0x03)、(&0xf0)
&表示与、且运算。 按位运算(11)就得出1,否则(10,01,00)就是0
011001
&
010101
=
010001
就可以使用&,扣出M的后2位、a的前4位
0x03:2位(00,01,10,11)最大值就是3-->16进制就是0x03
0xf0:4位(0000,0001,....,1111)最大值是16-->16进制就是0xf0
获得转码后的第三个字符:
同理移位运算得出--000101=5
Base64位编码,第5个编码为F
获得转码后的第四个字符:
最后一个字符无须移位,只需要将n字符的后6位扣出来即可
"n“ & 0x3f--101110=46
Base64位编码,第46个编码为u
最后转码结束,将得到的一组转码字符集合:TWFu
char4[0] = (byte) ((char3[0] & 0xfc) >> 2);
char4[1] = (byte) (((char3[0] & 0x03) << 4) + ((char3[1] & 0xf0) >> 4));
char4[2] = (byte) (((char3[1] & 0x0f) << 2) + ((char3[2] & 0xc0) >> 6));
char4[3] = (byte) (char3[2] & 0x3f);
解码的时候,逆向移位即可