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是遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成一个新的字符串进行解码。

  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/vege/p/12675562.html
Copyright © 2011-2022 走看看