Base64编码原理

主要条件与前情

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,+,/,全部为可传输字符。
base64的对应码,共64个
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);

解码的时候,逆向移位即可

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值