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角星了吗? 右键看源码,就会发现图片是一串字符串 ![]()
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEwAAAA/CAIAAADFQ7kTAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJJSURBVGhD7ZVBluIwDES5RN95bs1oxkWe84ODZUumu8l/xQJXWXJt4Hb/AK6Sv4WrZBx/bl9F+r6WFSW3hu/qeZWMAA2L5K3iKhkB6hXJW0VuSXSrpcQSrpJzoNVRyuWzruTTkzW8s6SpJLPJKtkq0zpP5So5CpqYZJxaeawoqdMH524G8SXRwSTjAVyTjDTSS+p0T08mkKukH7zeJGMPMiYZOagkVkapDH8KklHS9D3/SiIXqLLjKUgGSgsqbkgEShvaIB8oLXjwGSXtg0SIyvSX4FaINLqi64enZL4JeBuk0J7dXwgu1FLi3eBVkEIHdiUNXIMUegd4CaRQA5YsYASk0CqwHVLolOclCxgHKZQJNkIKdXBW0sBcSKEcsAtSqI8XJQtYACkUB+ZDCnnoKlnAMkihOTATUsiPo2QBi2spMQEGbpI9irukgRdskj0Kpm2SPcFIyQKeYpIxCqaZZEwTVlKnc2TMNL51SZOMOQZL4ikmGdNkjI0pqdMIMiaPlMQ7TDLaDCQ3yZggoKROGyBcJK+BK9xDYknEjlLuQGesH3dJvMAkowKBc+lOBQImGaPMltRpBQI90s2KlwEXvpLYbZLxH1hQT2ADlknGEFMldep5vQEXUqi9a4DZkjg5qlwEyBx1zJSLYzhKYutL6Vob5F9K1/yklNSFPnD3RLrgJ7ikon4wpyWlnfSWxLKjlJsDM49SzklASSXiwPxaSjiZKikvB+wqkudkvKSMTLDRJMPJyA+Pvq9ifq+j5M/lKvlb+ICS9/tf0UL+CL7wXbAAAAAASUVORK5CYII=" alt="" />
5: base64编码后字节的变化
很容易推算出, 编码后,每6个位变成8个位.
因此,编码后字节约比编码前多33%.
6: base64串结尾的”=”可以去掉吗?
从上面的编码规则可以反推出, 在base64解码的过程中, 要清除掉结尾处的等号,
然后再反查”base64索引与字母对照表”,转换成原始的字节序列.
那么,去掉尾部的等号,并没有丢失原始信息,但结构变得不规范.
解码前是否判断完整性,这取决于你的应用程序.
实测PHP中的base64_decode函数,并不检测尾部的等号是否完整.
base64编码以及url safe base64是怎么工作的?的更多相关文章
- Base64编码通过URL传值的问题
base64 编码中使用了 +号,+号通过URL传递时会变成空格,因为编码的方式的问题前台使用:Ext.encode(title_text.getValue().replace(/\+/g, '%2B ...
- Scala解码base64编码的URL提示Last unit does not have enough valid bits
问题描述 开始使用Base64.getMimeDecoder().decode(base_url).map(_.toChar).mkString去解码,部分数据也提示如题的错误 然后尝试使用Base6 ...
- BASE64编码的字符进行URL传输丢失特殊字符的问题
因为BASE64的编码里含有“+”号等特殊字符,在url传输的时候会把+号编程空格,解决这个问题的方法: 请求时把BASE64编码进行url的编码再进行传输 接收时把BASE64编码进行url的解码 ...
- 图片的base64编码通过javascript生成图片--当前URL地址的二维码应用
前面的话 在电脑端发现一篇好的博文,想在手机上访问.这时,就必须打开手机浏览器输入长长的URL地址才行,非常不方便.如果在博客标题的后面跟一张小的图片,点击该图片后,出现一张二维码的大图,然后再通过手 ...
- 【前端攻略】:玩转图片Base64编码
引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的 base64 编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的 base64 编码.标题略大,不过只是希望通过一些浅显 ...
- 玩转图片Base64编码
什么是 base64 编码? 图片的 base64 编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址. 这样做有什么意义呢?我们知道,我们所看到的网页上的每一个图片,都是需要消耗一 ...
- Base64编码原理与应用
本文内容转自网络,如需详细内容,请参考相关网址. http://my.oschina.net/goal/blog/201032 代码参考:http://blog.csdn.net/prsniper/a ...
- Base64编码的java实现
Java本身是提供了Base64编码的工具包的,做项目的时候自己实现了个,在这里记录一下: /** Base64编码数组 */ private static final String base64En ...
- 【前端攻略】:玩转图片Base64编码(转)
引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的Base64编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的base64编码.标题略大,不过只是希望通过一些浅显的论述, ...
随机推荐
- Visual Studio 跨平台開發實戰(3) - Xamarin iOS 多頁面應用程式開發 (转帖)
前言 在前一篇教學中, 我們學會如何使用Visual Studio 搭配Xcode 進行iOS基本控制項的操作. 但都是屬於單一畫面的應用程式. 這次我們要來練習如何透過Navigation Cont ...
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. 调用函数约定不同
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is ...
- CentOS 7 下 MySql5.7 主从配置
演示用两台全新MySql服务器: mysql1:10.10.1.55 (主) mysql2:10.10.1.56 (从) 配置主从,步骤如下: STEP 1:在mysql1上创建复制账号 repl ...
- 2-7 js基础-ajax封装
function json2url(json) { var arr = []; for (var name in json) { arr.push(name+'='+encodeURIComponen ...
- Asp.Net的Forms验证,解决Cookie和Seesion失效时间
网站开发中用户验证一般采用Asp.Net的Forms验证,验证票据存储到Cookie的方式. Session方式是将验证信息存储在内存中,如果你使用的虚拟主机给你分配很小的内存,实际上都是如此,那么s ...
- UTF-8编码
UTF-8是UNICODE的一种变长度的编码表达方式<一般UNICODE为双字节(指UCS2)>,它由Ken Thompson于1992年创建,现在已经标准化为RFC 3629.UTF-8 ...
- 转:不用安装Oracle客户端,远程连接Oracle数据库
转摘自: http://blog.sina.com.cn/s/blog_90b20fe70101az2z.html Oracle数据库安装过程较为繁琐,而且卸载更加麻烦,如果卸载不干净,下次安装Ora ...
- C# Aspose填充excel模板数据,下载
public Result<object> GetAExcelFieItem(string[] aid, int kind, string contype) { string fileUr ...
- Mybatis初始
1.Mybatis 的作用 完成基本的sql语句 和 存储过程 高级的对象关系映射(ORM) 框架 封装了几乎所有的 JDBC 代码 参数的手工设置 结果集的遍历 2.Mybatis 框架的主体构成 ...
- 撩课-Java每天5道面试题第21天
136.请解释Spring Bean的生命周期? 首先说一下Servlet的生命周期: 实例化, 初始init, 接收请求service, 销毁destroy: Spring上下文中的Bean生命周期 ...