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编码,随后将+和/分别替换为- _两个字符,在接收端则做相反的动作解码.

 /**
* 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;
}

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角星了吗? 右键看源码,就会发现图片是一串字符串 
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEwAAAA/CAIAAADFQ7kTAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJJSURBVGhD7ZVBluIwDES5RN95bs1oxkWe84ODZUumu8l/xQJXWXJt4Hb/AK6Sv4WrZBx/bl9F+r6WFSW3hu/qeZWMAA2L5K3iKhkB6hXJW0VuSXSrpcQSrpJzoNVRyuWzruTTkzW8s6SpJLPJKtkq0zpP5So5CpqYZJxaeawoqdMH524G8SXRwSTjAVyTjDTSS+p0T08mkKukH7zeJGMPMiYZOagkVkapDH8KklHS9D3/SiIXqLLjKUgGSgsqbkgEShvaIB8oLXjwGSXtg0SIyvSX4FaINLqi64enZL4JeBuk0J7dXwgu1FLi3eBVkEIHdiUNXIMUegd4CaRQA5YsYASk0CqwHVLolOclCxgHKZQJNkIKdXBW0sBcSKEcsAtSqI8XJQtYACkUB+ZDCnnoKlnAMkihOTATUsiPo2QBi2spMQEGbpI9irukgRdskj0Kpm2SPcFIyQKeYpIxCqaZZEwTVlKnc2TMNL51SZOMOQZL4ikmGdNkjI0pqdMIMiaPlMQ7TDLaDCQ3yZggoKROGyBcJK+BK9xDYknEjlLuQGesH3dJvMAkowKBc+lOBQImGaPMltRpBQI90s2KlwEXvpLYbZLxH1hQT2ADlknGEFMldep5vQEXUqi9a4DZkjg5qlwEyBx1zJSLYzhKYutL6Vob5F9K1/yklNSFPnD3RLrgJ7ikon4wpyWlnfSWxLKjlJsDM49SzklASSXiwPxaSjiZKikvB+wqkudkvKSMTLDRJMPJyA+Pvq9ifq+j5M/lKvlb+ICS9/tf0UL+CL7wXbAAAAAASUVORK5CYII=" alt="" />

6: base64编码后字节的变化

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

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

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

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

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

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

最新文章

  1. 十一个行为模式之中介者模式(Mediator Pattern)
  2. [转]扩展RBAC用户角色权限设计方案
  3. HTML 折行 &lt;br/&gt;标签
  4. [ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)
  5. 海蜘蛛WiFiDog固件 MTK7620 OEM,带云AC功能、探针、广告插入,MTK7620解包打包维修默认参数
  6. 《MFC游戏开发》笔记七 游戏特效的实现(一):背景滚动
  7. C# PLINQ 内存列表查询优化历程
  8. 如何生成Dump文件
  9. Hdu1384-Intervals(差分约束)
  10. tween.js的使用
  11. udev实现热插拔
  12. Choose the best route(最短路)dijk
  13. openlayers调用瓦片地图分析
  14. php的运行原理、cgi对比fastcgi以及php-cgi和php-fpm之间的联系区别
  15. Python——eventlet.wsgi
  16. Postman—构建工作流
  17. mac苹果ping不通网络
  18. 三分 - HNU 13409 Flowers
  19. 网站运维之 使用IIS日志分析器1.03.exe进行IIS服务器日志分析
  20. html中通过移除空格的方法来解决浏览器上的留白间距该怎么理解?

热门文章

  1. Elasticsearch学习系列之介绍安装
  2. 手游产品经理初探(二)从营销角度看loading界面
  3. 创建一个Cordova完整应用
  4. linux 打包 压缩
  5. hdu1078 FatMouse and Cheese(记忆化搜索)
  6. SSH-struts2的异常处理
  7. 2016/1/21 练习 arraylist 1,添加 add() 2,遍历集合
  8. 解决Hibernate4执行update操作,不更新数据的问题
  9. js实现IOS上删除app时颤抖动画j函数
  10. xUnit随笔