研究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个字符刚好可以。宁愿取小的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

待完善

 

目录
相关文章
|
8天前
|
监控 算法 安全
基于 PHP 语言深度优先搜索算法的局域网网络监控软件研究
在当下数字化时代,局域网作为企业与机构内部信息交互的核心载体,其稳定性与安全性备受关注。局域网网络监控软件随之兴起,成为保障网络正常运转的关键工具。此类软件的高效运行依托于多种数据结构与算法,本文将聚焦深度优先搜索(DFS)算法,探究其在局域网网络监控软件中的应用,并借助 PHP 语言代码示例予以详细阐释。
22 1
|
3天前
|
存储 监控 算法
基于 Python 哈希表算法的员工上网管理策略研究
于当下数字化办公环境而言,员工上网管理已成为企业运营管理的关键环节。企业有必要对员工的网络访问行为予以监控,以此确保信息安全并提升工作效率。在处理员工上网管理相关数据时,适宜的数据结构与算法起着举足轻重的作用。本文将深入探究哈希表这一数据结构在员工上网管理场景中的应用,并借助 Python 代码示例展开详尽阐述。
28 3
|
7天前
|
存储 算法 JavaScript
基于 Node.js 深度优先搜索算法的上网监管软件研究
在数字化时代,网络环境呈现出高度的复杂性与动态性,上网监管软件在维护网络秩序与安全方面的重要性与日俱增。此类软件依托各类数据结构与算法,实现对网络活动的精准监测与高效管理。本文将深度聚焦于深度优先搜索(DFS)算法,并结合 Node.js 编程语言,深入剖析其在上网监管软件中的应用机制与效能。
24 6
|
23天前
|
监控 算法 安全
基于 Python 广度优先搜索算法的监控局域网电脑研究
随着局域网规模扩大,企业对高效监控计算机的需求增加。广度优先搜索(BFS)算法凭借其层次化遍历特性,在Python中可用于实现局域网内的计算机设备信息收集、网络连接状态监测及安全漏洞扫描,确保网络安全与稳定运行。通过合理选择数据结构与算法,BFS显著提升了监控效能,助力企业实现智能化的网络管理。
28 7
|
1月前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
35 3
|
1月前
|
监控 算法 安全
内网桌面监控软件深度解析:基于 Python 实现的 K-Means 算法研究
内网桌面监控软件通过实时监测员工操作,保障企业信息安全并提升效率。本文深入探讨K-Means聚类算法在该软件中的应用,解析其原理与实现。K-Means通过迭代更新簇中心,将数据划分为K个簇类,适用于行为分析、异常检测、资源优化及安全威胁识别等场景。文中提供了Python代码示例,展示如何实现K-Means算法,并模拟内网监控数据进行聚类分析。
51 10
|
1月前
|
存储 算法 安全
基于 Go 语言的公司内网管理软件哈希表算法深度解析与研究
在数字化办公中,公司内网管理软件通过哈希表算法保障信息安全与高效管理。哈希表基于键值对存储和查找,如用户登录验证、设备信息管理和文件权限控制等场景,Go语言实现的哈希表能快速验证用户信息,提升管理效率,确保网络稳定运行。
30 0
|
2月前
|
机器学习/深度学习 人工智能 算法
Transformer打破三十年数学猜想!Meta研究者用AI给出反例,算法杀手攻克数学难题
《PatternBoost: Constructions in Mathematics with a Little Help from AI》提出了一种结合传统搜索算法和Transformer神经网络的PatternBoost算法,通过局部搜索和全局优化交替进行,成功应用于组合数学问题。该算法在图论中的Ramsey数研究中找到了更小的反例,推翻了一个30年的猜想,展示了AI在数学研究中的巨大潜力,但也面临可解释性和通用性的挑战。论文地址:https://arxiv.org/abs/2411.00566
110 13
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19
104 3
|
5月前
|
存储 人工智能 算法
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-18
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-18
67 0

热门文章

最新文章