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

url-safe base64 && base64的更多相关文章

  1. URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  2. 图片转成base64, base64转成图片

    1.我们在看代码时经常在img或css背景图片中看到: src=”data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAMAAAAOusbgA ...

  3. json序列化.xml序列化.图片转base64.base64转图片.生成缩略图.IEnumerable<TResult> Select<TSource, TResult>做数据转换的五种方式

     JSON序列化 /// <summary> /// JSON序列化 /// </summary> public static class SPDBJsonConvert { ...

  4. base64编码以及url safe base64是怎么工作的?

    原文转自 http://www.yanshiba.com/archives/638 1: 为什么需要base64? ASCII码一共规定了128个字符的编码,这128个符号,范围在[0,127]之间. ...

  5. URL中增加BASE64加密的字符串引起的问题(java.net.MalformedURLException:Illegal character in URL)

    序 昨天在做一个 Demo 的时候,因为是调用第三方的接口,採用的是 HTTP 的通信协议,依照文档上的说明,须要把參数进行加密后增加到 URL 中.可是,就是这个看似普普通通的操作,却让我着实费了非 ...

  6. URL编码和Base64编码 (转)

    我们经常会遇到所谓的URL编码(也叫百分号编码)和Base64编码.      先说一下Bsae64编码.BASE64编码是一种常用的将二进制数据转换为64个可打印字符的编码,常用于在通常处理文本数据 ...

  7. URL编码表 Base64编码表 HTTP消息含义

    URL编码表 backspace 8% A 41% a 61% § %A7 Õ %D5   tab 9% B 42% b 62% « %AB Ö %D6   linefeed %0A C 43% c ...

  8. URL安全的Base64编码,解码

    Base64 可以将二进制转码成可见字符方便进行http传输,但是base64转码时会生成“+”,“/”,“=”这些被URL进行转码的特殊字符,导致两方面数据不一致. 我们可以在发送前将“+”,“/” ...

  9. 通过url地址传递base64加密参数遇到的问题整理

    1. base64的加密解密方法在C#的类库中就有 QueryString中的加号变成了空格问题 Server.UrlEncode(username),获取到的编码又将等于号变成了%3d; 到底改怎么 ...

  10. PHP URL安全的Base64位编码

    先将内容编码成Base64结果; 将结果中的加号”+”替换成中划线“-“; 将结果中的斜杠”/”替换成下划线”_”; 将结果中尾部的“=”号全部保留; 实现 编码 function urlsafe_b ...

随机推荐

  1. 【大数据处理架构】1.spark streaming

    1. spark 是什么? >Apache Spark 是一个类似hadoop的开源高速集群运算环境  与后者不同的是,spark更快(官方的说法是快近100倍).提供高层JAVA,Scala, ...

  2. Jafka源码分析——LogManager

    在Kafka中,LogManager负责管理broker上全部的Log(每个topic-partition为一个Log). 通过阅读源码可知其详细完毕的功能例如以下: 1. 依照预设规则对消息队列进行 ...

  3. Jquery第四课 Javascript中this的使用方法

    thiskeyword的使用 在JavaScript中使用thiskeyword表示调用方法的对象,这与大部分面向对象语言是一样的.可是因为call.apply.bind等函数的影响.我们能够改变th ...

  4. web 开发之js---JS变量也要注意初始化

    原先以为js作为弱类型语言,变量的初始化没必要,但是: var text; text+="你好"; alert(text); 对话框弹出的内容是:"undefined你好 ...

  5. Mac OS X 10.10下Versions crash的问题

    升级完系统.Versions由于兼容性到问题,各种闪退,网上搜索了一下.知乎到一个帖子提到了暂时解决的方法,例如以下: Blackpixel 正在研究此崩溃的修复方案.暂时解决方式例如以下: 在文本编 ...

  6. Flex 页面启动事件

    事件启动顺序 容器Preinitialize=>子组件preinitialize=>子组件initialize=>childAdd=>initialize =>子组件cr ...

  7. Codevs 1744 格子染色==BZOJ 1296 粉刷匠

    1744 格子染色  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有 n 条木板需要被粉 ...

  8. Node.js+Express搭建博客系统基本环境安装

    1.下载安装node.js 官网下载地址:https://nodejs.org/en/download/ 2.安装express. 打开node命令行工具,在命令行中输入:npm install -g ...

  9. Codeforces Round #363 (Div. 2)E. LRU

    E. LRU time limit per test 2 seconds memory limit per test 256 megabytes input standard input output ...

  10. 韩顺平Oracle笔记

    韩顺平Oracle笔记 分类: DataBase2011-09-07 10:24 3009人阅读 评论(0) 收藏 举报 oracle数据库sqljdbcsystemstring   目录(?)[-] ...