原文转自 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是怎么工作的?的更多相关文章

  1. Base64编码通过URL传值的问题

    base64 编码中使用了 +号,+号通过URL传递时会变成空格,因为编码的方式的问题前台使用:Ext.encode(title_text.getValue().replace(/\+/g, '%2B ...

  2. Scala解码base64编码的URL提示Last unit does not have enough valid bits

    问题描述 开始使用Base64.getMimeDecoder().decode(base_url).map(_.toChar).mkString去解码,部分数据也提示如题的错误 然后尝试使用Base6 ...

  3. BASE64编码的字符进行URL传输丢失特殊字符的问题

    因为BASE64的编码里含有“+”号等特殊字符,在url传输的时候会把+号编程空格,解决这个问题的方法: 请求时把BASE64编码进行url的编码再进行传输 接收时把BASE64编码进行url的解码 ...

  4. 图片的base64编码通过javascript生成图片--当前URL地址的二维码应用

    前面的话 在电脑端发现一篇好的博文,想在手机上访问.这时,就必须打开手机浏览器输入长长的URL地址才行,非常不方便.如果在博客标题的后面跟一张小的图片,点击该图片后,出现一张二维码的大图,然后再通过手 ...

  5. 【前端攻略】:玩转图片Base64编码

    引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的 base64 编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的 base64 编码.标题略大,不过只是希望通过一些浅显 ...

  6. 玩转图片Base64编码

    什么是 base64 编码? 图片的 base64 编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址. 这样做有什么意义呢?我们知道,我们所看到的网页上的每一个图片,都是需要消耗一 ...

  7. Base64编码原理与应用

    本文内容转自网络,如需详细内容,请参考相关网址. http://my.oschina.net/goal/blog/201032 代码参考:http://blog.csdn.net/prsniper/a ...

  8. Base64编码的java实现

    Java本身是提供了Base64编码的工具包的,做项目的时候自己实现了个,在这里记录一下: /** Base64编码数组 */ private static final String base64En ...

  9. 【前端攻略】:玩转图片Base64编码(转)

    引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的Base64编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的base64编码.标题略大,不过只是希望通过一些浅显的论述, ...

随机推荐

  1. Linus' Law

    Given enough eyeballs, all bugs are shallow.                                               ------埃里克 ...

  2. rpm: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such file or directory解决办法

    不多说,直接上干货! 问题详情 [root@bigdatamaster app]# rpm -qa | grep gcc rpm: error : cannot open shared object ...

  3. Hive 外部表新增字段或者修改字段类型等不生效

    标题比较笼统,实际情况是: 对于Hive 的分区外部表的已有分区,在对表新增或者修改字段后,相关分区不生效. 原因是:表元数据虽然修改成功,但是分区也会对应列的元数据,这个地方不会随表的元数据修改而修 ...

  4. python-Lock进程同步解决互斥

    #!/usr/bin/python from multiprocessing import Process,Lock import time,sys def A(lock): with lock: f ...

  5. WPF Binding(四种模式)

    在使用Binding类的时候有4中绑定模式可以选择 BindingMode TwoWay 导致对源属性或目标属性的更改可自动更新对方.此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案. OneW ...

  6. 吴恩达《深度学习》第五门课(1)循环序列模型(RNN)

    1.1为什么选择序列模型 (1)序列模型广泛应用于语音识别,音乐生成,情感分析,DNA序列分析,机器翻译,视频行为识别,命名实体识别等众多领域. (2)上面那些问题可以看成使用(x,y)作为训练集的监 ...

  7. 解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function

    Vue的项目中,如果项目简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 进行传递 但是如果是大中型项目中,很多时候都需要在不相关的平行组件之间传递数据,并且很多数据需要 ...

  8. i.mx6 Android5.1.1 System server

    1. 概述: 1. Zygote进程是Android Java世界的开创者,所有的Java应用程序进程都由Zygote进程创建: 2. Zygote创建应用程序进程过程其实就是复制自身进程地址空间作为 ...

  9. 使用IndexOf方法来判断“咳嗽”出现的次数及索引、使用Dictionary<key,value> 集合统计没个字符出现的次数

    static void Main(string[] args) { #region string str = "患者:医生我咳嗽的很严重,大夫:你多大年纪了? 患者:我75岁 大夫:那二十岁 ...

  10. MYSQL登录错误:mysqladmin: connect to server at ‘localhost’ failed

    一.mysql登录错误 mysqladmin: connect to server at 'localhost' failed       error: 'Access denied for user ...