zoukankan      html  css  js  c++  java
  • base64编码以及url safe base64是怎么工作的?

    原文转自 http://www.yanshiba.com/archives/638

    1: 为什么需要base64?

    ASCII码一共规定了128个字符的编码,这128个符号,范围在[0,127]之间.
    其中,[0,31],及127, 33个属于不可打印的控制字符.

    在电子邮件传输信息时,有些邮件网关会把[0,31]这些控制字符给悄悄清除.
    还有的早期程序,收到[128,255]之间的国际字符时,甚至会发生错误.

    如何在不同邮件网关之间安全的传输控制字符,国际字符,甚至二进制文件?
    于是作为MIME多媒体电子邮件标准的一部分—base64被开发出来.

    1.a 什么是url_safe base64编码?

    在上面的base64传统编码中会出现+, /两个会被url直接转义的符号,因此如果希望通过url传输这些编码字符串,我们

    需要先做传统base64编码,随后将+和/分别替换为- _两个字符,在接收端则做相反的动作解码

    http://www.ietf.org/rfc/rfc4648.txt

      /**
         * URL base64解码
         * '-' -> '+'
         * '_' -> '/'
         * 字符串长度%4的余数,补'='
         * @param unknown $string
         */
      function urlsafe_b64decode($string) {
            $data = str_replace(array('-','_'),array('+','/'),$string);
            $mod4 = strlen($data) % 4;
            if ($mod4) {
                $data .= substr('====', $mod4);
            }
            return base64_decode($data);
        }
        
        /**
         * URL base64编码
         * '+' -> '-'
         * '/' -> '_'
         * '=' -> ''
         * @param unknown $string
         */
        function urlsafe_b64encode($string) {
            $data = base64_encode($string);
            $data = str_replace(array('+','/','='),array('-','_',''),$data);
            return $data;
        }

    2: 一句话说完base64怎么工作的?

    把N字节的内容对应的8*N位, 每6位砍成1段,得到 (8*N)/6 个单元,
    每个单元的值,都在[0,63]之间,再把其值对应1个ascii字符,拼接起来,OK!

    base64_encode(’PHP’) ==> ‘UEhQ’, 编码过程如下:

    3: 如果每6位砍成1段,但不能整除,余下2个位或4位怎么办?

    用”0″来补至6位, 并再次转化为”base64字符表”中的某个字符.

    然后,再用”=”字符当做6个位,继续填充,直至总位数能被8带整除.

    字符串 二进制序列(红字为填充位) 编码结果
    PHP 010100 000100 100001 010000 UEhQ
    it 011010 010111 0100

    00 xxxxxx

    aXQ=
    bool 011000 100110 111101 101111 011011 00

    0000 xxxxxx xxxxxx

    Ym9vbA==

    4:base64表示图片

    通过上面的演示,可以看出,base64也可以编码二进制文件,如邮件中的图片和附件.
    编码后,我们可以在网页或邮件的源码里,直接体现此图片,
    而不必把图片放在服务器上,引用其链接.

    用例:base64(’abc.png’) ==> ‘encoded-result’;
    则在网页中, <img src=”data:image/png;base64,encoded-result” />

    看到下面这个5角星了吗? 右键看源码,就会发现图片是一串字符串 :)

    5: base64编码后字节的变化

    很容易推算出, 编码后,每6个位变成8个位.
    因此,编码后字节约比编码前多33%.

    6: base64串结尾的”=”可以去掉吗?

    从上面的编码规则可以反推出, 在base64解码的过程中, 要清除掉结尾处的等号,
    然后再反查”base64索引与字母对照表”,转换成原始的字节序列.

    那么,去掉尾部的等号,并没有丢失原始信息,但结构变得不规范.
    解码前是否判断完整性,这取决于你的应用程序.

    实测PHP中的base64_decode函数,并不检测尾部的等号是否完整.

  • 相关阅读:
    简道云--编辑应用入门
    虚拟机迁移
    KVM虚拟化网络管理(一)
    keepalived概述
    kvm虚拟化存储管理
    免密登录gitlab
    KVM虚拟化介绍
    Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署静态网站
    Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站
    Jenkins凭证介绍
  • 原文地址:https://www.cnblogs.com/kidsitcn/p/6901431.html
Copyright © 2011-2022 走看看