url-safe base64 && base64
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的更多相关文章
- URL安全的Base64编码
Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...
- 图片转成base64, base64转成图片
1.我们在看代码时经常在img或css背景图片中看到: src=”data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAMAAAAOusbgA ...
- json序列化.xml序列化.图片转base64.base64转图片.生成缩略图.IEnumerable<TResult> Select<TSource, TResult>做数据转换的五种方式
JSON序列化 /// <summary> /// JSON序列化 /// </summary> public static class SPDBJsonConvert { ...
- base64编码以及url safe base64是怎么工作的?
原文转自 http://www.yanshiba.com/archives/638 1: 为什么需要base64? ASCII码一共规定了128个字符的编码,这128个符号,范围在[0,127]之间. ...
- URL中增加BASE64加密的字符串引起的问题(java.net.MalformedURLException:Illegal character in URL)
序 昨天在做一个 Demo 的时候,因为是调用第三方的接口,採用的是 HTTP 的通信协议,依照文档上的说明,须要把參数进行加密后增加到 URL 中.可是,就是这个看似普普通通的操作,却让我着实费了非 ...
- URL编码和Base64编码 (转)
我们经常会遇到所谓的URL编码(也叫百分号编码)和Base64编码. 先说一下Bsae64编码.BASE64编码是一种常用的将二进制数据转换为64个可打印字符的编码,常用于在通常处理文本数据 ...
- 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 ...
- URL安全的Base64编码,解码
Base64 可以将二进制转码成可见字符方便进行http传输,但是base64转码时会生成“+”,“/”,“=”这些被URL进行转码的特殊字符,导致两方面数据不一致. 我们可以在发送前将“+”,“/” ...
- 通过url地址传递base64加密参数遇到的问题整理
1. base64的加密解密方法在C#的类库中就有 QueryString中的加号变成了空格问题 Server.UrlEncode(username),获取到的编码又将等于号变成了%3d; 到底改怎么 ...
- PHP URL安全的Base64位编码
先将内容编码成Base64结果; 将结果中的加号”+”替换成中划线“-“; 将结果中的斜杠”/”替换成下划线”_”; 将结果中尾部的“=”号全部保留; 实现 编码 function urlsafe_b ...
随机推荐
- CentOS 5.5 介绍
转载:http://www.osyunwei.com/archives/3625.html 操作系统:CentOS 5.5主机名称:wwwIP地址:192.168.21.128网关:192.168.2 ...
- STL之关联容器的映射底层
STL的关联容器有set, map, multiset, multimap.用于实现它们的底层容器有划入标准的rb_tree和待增加标准的hashtable. 底层容器rb_tree为上层容器提供了一 ...
- 找了两个node+vue-cli+mogodb的小项目学学
实现的博客系统,自己抽时间搭建看看 https://www.cnblogs.com/yesyes/p/7188331.html https://github.com/chaohangz/vueBlog
- FunctionGraph无缝集成Express应用
Express APP 作为一个Node.js开发者,相信大家都可能会使用Express框架,无论是构建后端服务,或是搭建一个前端的开发态服务器,Express都是一个很流行的选择.构建Express ...
- [转] Ubuntu/Linux Mint/Debian 安装 Java 8
本PPA由webupd8制作,支持Ubuntu .04以及对应的Linux Mint版本,Oracle Java 8包提供JDK8 和 JRE8. sudo add-apt-repository pp ...
- java web中的session属性范围和request属性范围
首先必需要了解client跳转和server端跳转的差别: client跳转: response.sendRedict(String path).地址栏发生改变. 不能传递request属性. ser ...
- JavaScript基础 -- js常用内置方法和对象
JS中常用的内置函数如下: 1.eval(str):计算表达式的结果. 2.parseInt(str,n):将符串转换成整数数字形式(可指定几进制). 3.parseFloat(str):将字符串转换 ...
- struts2基础代码实现
结构图: load.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...
- Robot Framework快捷键图标制作 去掉cmd命令窗口
安装好Robot Framework之后,通过 C:\Python27\Scripts\ride.py 启动时会带上一个命令行窗口: 怎样让启动的界面后面不带这个命令行窗口,且图片以机器人显示? 方法 ...
- H264 层次构成[2]
H264层次构成 H264标准是由JVT(Joint Video Team,视频联合工作组)组织提出的新一代数字视频编码标准.JVT于2001年12月在泰国Pattaya成立.它由ITU-T的VCEG ...