博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
url-safe base64 && base64
阅读量:4673 次
发布时间:2019-06-09

本文共 2127 字,大约阅读时间需要 7 分钟。

1: 为什么需要base64?

ASCII码一共规定了128个字符的编码,这128个符号,范围在[0,127]之间.

其中,[0,31],及127, 33个属于不可打印的控制字符.

  在电子邮件传输信息时,有些邮件网关会把[0,31]这些控制字符给悄悄清除.

还有的早期程序,收到[128,255]之间的国际字符时,甚至会发生错误.

  如何在不同邮件网关之间安全的传输控制字符,国际字符,甚至二进制文件?

于是作为MIME多媒体电子邮件标准的一部分—base64被开发出来.

2. 什么是url_safe base64编码?

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

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

1 /** 2      * URL base64解码 3      * '-' -> '+' 4      * '_' -> '/' 5      * 字符串长度%4的余数,补'=' 6      * @param unknown $string 7      */ 8   function urlsafe_b64decode($string) { 9         $data = str_replace(array('-','_'),array('+','/'),$string);10         $mod4 = strlen($data) % 4;11         if ($mod4) {12             $data .= substr('====', $mod4);13         }14         return base64_decode($data);15     }16     17     /**18      * URL base64编码19      * '+' -> '-'20      * '/' -> '_'21      * '=' -> ''22      * @param unknown $string23      */24     function urlsafe_b64encode($string) {25         $data = base64_encode($string);26         $data = str_replace(array('+','/','='),array('-','_',''),$data);27         return $data;28     }

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

  把N字节的内容对应的8*N位, 每6位砍成1段,得到 (8*N)/6 个单元,

每个单元的值,都在[0,63]之间,再把其值对应1个ascii字符,拼接起来,OK!

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

4: 如果每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==

 

5:base64表示图片

  通过上面的演示,可以看出,base64也可以编码二进制文件,如邮件中的图片和附件.

编码后,我们可以在网页或邮件的源码里,直接体现此图片,
而不必把图片放在服务器上,引用其链接.

  用例:base64(’abc.png’) ==> ‘encoded-result’;

则在网页中, <img src=”data:image/png;base64,encoded-result” />

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

6: base64编码后字节的变化

很容易推算出, 编码后,每6个位变成8个位.

因此,编码后字节约比编码前多33%.

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

从上面的编码规则可以反推出, 在base64解码的过程中, 要清除掉结尾处的等号,

然后再反查”base64索引与字母对照表”,转换成原始的字节序列.

那么,去掉尾部的等号,并没有丢失原始信息,但结构变得不规范.

解码前是否判断完整性,这取决于你的应用程序.

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

 

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

 

转载于:https://www.cnblogs.com/guoguochong/p/8631647.html

你可能感兴趣的文章
SHT30 Linux标准 i2c-dev 读取程序
查看>>
wpf TabControl控件的用法
查看>>
centos7忘记密码处理办法
查看>>
【Nginx】磁盘文件写入飞地发
查看>>
默认情况下安装的应用程序C盘后提示权限不足,当你开始介意。。。
查看>>
su root 后还是不能使用useradd ,useradd 等命令
查看>>
URL.createObjectURL图片预览
查看>>
js 中exec、test、match、search、replace、split用法
查看>>
Android开发笔记(一)手势识别
查看>>
mybatis 复习笔记03
查看>>
zoj 3703(背包)
查看>>
一种新的子波域滤波算法
查看>>
cookie之三天免登录代码
查看>>
1043 幸运号码 数位DP
查看>>
js18
查看>>
2018-2019-2 20175308实验一 《Java开发环境的熟悉》实验报告
查看>>
如何设置WIN7自动登录(去除登录密码)
查看>>
关于bash中if语法结构的广泛误解(转)
查看>>
10G整数文件中寻找中位数或者第K大数
查看>>
操作手机数据库的uri
查看>>