研究base64_encode的算法

简介:    从网上看了一些资料,为了方便自己理解,于是把它的编码原理,自己放在excel表格中清晰列出来,方便以后查阅。做的图如下:       ascii编码表   这个表很大,截图不出来。

 

 

 从网上看了一些资料,为了方便自己理解,于是把它的编码原理,自己放在excel表格中清晰列出来,方便以后查阅。做的图如下:

 

 

 

ascii编码表

 

这个表很大,截图不出来。网上有。0-255的整数表示256个字符,即2的8次方=256。2的7次方是128。

 参考:http://1024tools.com/ascii,图很清晰。

 

思考:base64编码算法,要求先去ascci表中对应字符的整数值。而ascci编码不支持中文的。从这个角度来看,base64_encode编码其实不支持中文编码的。具体中文编码后是什么情况,有待做一下试验后补充。

 

 

base64编码对应表

 

 

在程序中,用一个数组表示就是这样:

 

$base64_char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

 

比如整数24,那么就对应数组第25个元素:Y。

 

 

网上用的移位法,使用>>和<<,没有看明白怎么回事。根据编码的思路,拙劣地用php模拟实现了一个,对比一下与php内置的base64_encode()编码结果是不是一样

 

$string = 'abcde';

echo 'origin php 64 encode:';
var_dump(base64_encode($string));

function my_base64_encode($string = "") {
    $string_length = strlen($string);
//看余数
    $mod = $string_length % 3;
//echo 'mod:<br />';
//var_dump($mod);
    $add_bin_value = '';
    switch ($mod) {
        case 1:
            $add_bin_value = "0000000000000000";
            break;
        case 2:
            $add_bin_value = "00000000";
            break;
    }

    $group_count = ceil($string_length / 3); //得到多少组
//echo 'group <br />';
//var_dump($group_count);
    $string_arr = str_split($string, 1);
    $all_bin_value = '';
    foreach ($string_arr as $key => $value) {

        $ascii_int = ord($value); //得到这个字符在ascii表中的对应的10进制整数
        //然后把这个10进制整数,转换为二进制
        //echo '$ascii_int:' . $ascii_int . "<br />";

        $bin_value = decbin($ascii_int); //由于ascii的范围是0-255,如果是84,54这样比较小的值,这个函数会得到是一个1-7位的二进制。为了做到8位。于是增加判断一下,最高位要加0填充
        $str_len = strlen($bin_value);
        if ($str_len < 8) {
            $add_zero_count = 8 - $str_len; //要增加这么多个0在前面,以便补充8位
            for ($i = 0; $i < $add_zero_count; $i++) {
                $bin_value = '0' . $bin_value;
            }
        }
        //echo '$bin_value:' . $bin_value . "<br />";
        $all_bin_value.= $bin_value;
    }
    $all_bin_value = $all_bin_value . $add_bin_value;
    //var_dump($all_bin_value);
    $bin_group_list = str_split($all_bin_value, 6); //每6个二进制一组,进行分组
    //分组结果:
    //var_dump($bin_group_list);
    $base64_char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    $base64_char_arr = str_split($base64_char, 1);
//var_dump($base64_char_arr);
    $dec_int = 0;
    $base64_encode_result = '';
    foreach ($bin_group_list as $key => $value) {
        if ($value == '000000') {
            $base64_encode_result.='=';
        } else {
            $dec_int = bindec($value); //将二进制转换为10进制整数
            //echo $dec_int . "<br />";
            $base64_encode_result .= $base64_char_arr[$dec_int];
        }
    }
    
    return $base64_encode_result;
}


$base64_encode_result = my_base64_encode($string);
echo 'encode result:';
var_dump($base64_encode_result);
View Code

 

 

 

思考:

 

1、为什么要按照6位二进制一组进行分,而不是4位,7位等方式呢?

 

   因为要考虑到只有64个字符供选择,十进制只能从0到63。最大值63。使用6位,2的6次方,值是64。

   于是使用6位二进制的话,就能刚好对应出来。如果使用7位二进制。那么最大值是2的7次方,最大值是128。

   假设计算得到的是数字是112,那么base64编码表中如何去对应呢?

 

2、为什么要每三个字符为一组呢?不是2个,也不是4个字符一组。是什么考虑?

 

   不太清楚。尝试去分析一下,3个字符,,刚好是3*8=24位二进制。

 

  24个字符要分成6个二进制一组。就是4个组。

 

 

   2个字符呢,2*8=16  16/6也无法整除

 

   如果是4个字符一组,4*8=32个字符。32/6 无法整除。

 

   5个字符:5*8=40 40/6也无法整除。

 

   6个字符一组,6*8=48 48/6=8 刚好可以整除。怎么没用这个方式呢?

 

   应该是取小的原则。2个字符不可以,3个字符刚好可以。宁愿取小的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

待完善

 

目录
相关文章
|
4月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
482 0
|
4月前
|
存储 机器学习/深度学习 编解码
双选择性信道下正交啁啾分复用(OCDM)的低复杂度均衡算法研究——论文阅读
本文提出统一相位正交啁啾分复用(UP-OCDM)方案,利用循环矩阵特性设计两种低复杂度均衡算法:基于带状近似的LDL^H分解和基于BEM的迭代LSQR,将复杂度由$O(N^3)$降至$O(NQ^2)$或$O(iNM\log N)$,在双选择性信道下显著提升高频谱效率与抗多普勒性能。
292 0
双选择性信道下正交啁啾分复用(OCDM)的低复杂度均衡算法研究——论文阅读
|
4月前
|
存储 监控 算法
基于 Go 语言跳表结构的局域网控制桌面软件进程管理算法研究
针对企业局域网控制桌面软件对海量进程实时监控的需求,本文提出基于跳表的高效管理方案。通过多级索引实现O(log n)的查询、插入与删除性能,结合Go语言实现并发安全的跳表结构,显著提升进程状态处理效率,适用于千级进程的毫秒级响应场景。
221 15
|
4月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
288 8
|
5月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
340 3
|
5月前
|
canal 算法 vr&ar
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
190 1
|
4月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
232 0
|
4月前
|
存储 监控 算法
基于 PHP 布隆过滤器的局域网监控管理工具异常行为检测算法研究
布隆过滤器以其高效的空间利用率和毫秒级查询性能,为局域网监控管理工具提供轻量化异常设备检测方案。相比传统数据库,显著降低延迟与资源消耗,适配边缘设备部署需求,提升网络安全实时防护能力。(238字)
217 0
|
5月前
|
机器学习/深度学习 存储 算法
【微电网调度】考虑需求响应的基于改进多目标灰狼算法的微电网优化调度研究(Matlab代码实现)
【微电网调度】考虑需求响应的基于改进多目标灰狼算法的微电网优化调度研究(Matlab代码实现)
253 0
|
5月前
|
机器学习/深度学习 分布式计算 算法
【风场景生成与削减】【m-ISODATA、kmean、HAC】无监督聚类算法,用于捕获电力系统中风场景生成与削减研究(Matlab代码实现)
【风场景生成与削减】【m-ISODATA、kmean、HAC】无监督聚类算法,用于捕获电力系统中风场景生成与削减研究(Matlab代码实现)
248 0

热门文章

最新文章