zoukankan      html  css  js  c++  java
  • Base64编码与解码原理

    Base64编码是使用64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途。

    base64索引表

    base64编码与解码的基础索引表如下

    base64编码原理

    (1)base64编码过程

    Base64将输入字符串按字节切分,取得每个字节对应的二进制值(若不足8比特则高位补0),然后将这些二进制数值串联起来,再按照6比特一组进行切分(因为2^6=64),最后一组若不足6比特则末尾补0。将每组二进制值转换成十进制,然后在上述表格中找到对应的符号并串联起来就是Base64编码结果。

    由于二进制数据是按照8比特一组进行传输,因此Base64按照6比特一组切分的二进制数据必须是24比特的倍数(6和8的最小公倍数)。24比特就是3个字节,若原字节序列数据长度不是3的倍数时且剩下1个输入数据,则在编码结果后加2个=;若剩下2个输入数据,则在编码结果后加1个=。

    完整的Base64定义可见RFC1421和RFC2045。因为Base64算法是将3个字节原数据编码为4个字节新数据,所以Base64编码后的数据比原始数据略长,为原来的4/3。

    (2)简单编码流程

    1)将所有字符转化为ASCII码;
    
    2)将ASCII码转化为8位二进制;
    
    3)将8位二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位;
    
    4)将每组6位的二进制转为十进制;
    
    5)从Base64编码表获取十进制对应的Base64编码;

    下面举例对字符串“ABCD”进行base64编码:

    对于不足6位的补零(图中浅红色的4位),索引为“A”;对于最后不足3字节,进行补零处理(图中红色部分),以“=”替代,因此,“ABCD”的base64编码为:“QUJDRA==”。

    base64解码原理

    (1)base64解码过程

    base64解码,即是base64编码的逆过程,如果理解了编码过程,解码过程也就容易理解。将base64编码数据根据编码表分别索引到编码值,然后每4个编码值一组组成一个24位的数据流,解码为3个字符。对于末尾位“=”的base64数据,最终取得的4字节数据,需要去掉“=”再进行转换。

    解码过程可以参考上图,逆向理解:“QUJDRA==” ——>“ABCD”

    (2)base64解码特点

    base64编码中只包含64个可打印字符,而PHP在解码base64时,遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成一个新的字符串进行解码。下面编写一个简单的代码,测试一组数据看是否满足我们所说的情况。

    <?php

    $basestr0="vegerootQftm";
    $basestr1="vege#root@Qftm";
    $basestr2="vege^root&Qftm";
    $basestr3="veg>ero%otQftm";
    $basestr4="ve%%%geroo%%%tQftm";

    echo base64_decode($basestr0)."<br>";
    echo base64_decode($basestr1)."<br>";
    echo base64_decode($basestr2)."<br>";
    echo base64_decode($basestr3)."<br>";
    echo base64_decode($basestr4)."<br>";
    ?>

    从结果中可以看到一个字符串中,不管出现多少个特殊字符或者位置上的差异,都不会影响最终的结果,可以验证base64_decode是遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成一个新的字符串进行解码。

  • 相关阅读:
    【python小练】0020
    【python小练】0017-将xls文件内容写入xml文件中
    【python小练】图片爬虫之BeautifulSoup4
    【python小练】0013
    【python小练】0014题 和 0015 题
    【python小练】0012题
    【python小练】0011题
    【python小练】0010
    【python小练】0005
    2018.09.11python学习第1天
  • 原文地址:https://www.cnblogs.com/vege/p/12675562.html
Copyright © 2011-2022 走看看