针对base64编码和URIEncode的一点研究
Base64编码的作用
将任意的二进制比特串编码成由ASCii码中的64个可显示字符组成的字符串。
为什么需要base64编码?
所有的文件,本质上都是0、1组成的比特串,文本文件、二进制文件的区别只在于操作系统如何解读文件内容。前端最常用的html、css、js都是文本文件,而文本文件的所有比特都会被操作系统当做字符编码来解读(比如按照UTF-8编码规则来解读),所以,当我们想在一个文本文件里保存二进制文件的数据(比如在css文件里保存一张图片)时,就会遇到麻烦——比如,操作系统会强行把原本属于图片的二进制数据当成UTF-8编码串来解码,然后我们会在页面上得到一堆不知所云的乱码,甚至可能会破坏真正的文本数据区域。
当然,这个问题是有解的——我们用可显示的ASCii字符来编码二进制数据,然后保存在css等文本文件里,在真正使用到这些数据时(比如<img>标签渲染图片内容)再进行解码。这就是base64所做的事。
在浏览器环境下,我们有widow.btoa和window.atob两个全局方法,分别用于对数据进行base64编解码,其中a代表ASCii,b代表binary,知道了这个含义就不会把两个方法记反啦。
为什么码表里有64个字符?
因为ASCii码的可见字符只有95个,向下取整(2的n次方)就是64。
具体是哪64个?A-Z、a-z、0-9,以及+、/ 这两个符号。26+26+10+2正好是64。
除此之外,还有一个字符有时也会作为占位符出现在Base64编码串的末尾,即等号 = 。一个等号表示编码时在原比特串的末尾补了2bit的0。等号只可能出现1或2个,下面会解释为什么。
为什么base64编码后文件体积会变大?
在64个字符的码表里,一个字符可以表示6bit的数据(2^6=64),而这样一个ASCii码字符要占一个字节(1byte = 8bit),也就是说,base64编码其实是用8个比特来表示原二进制串里的6个比特,所以编码后体积是原二进制串的4/3。
正是因为这个原因,前端base64编码只适用于小文件,因为增加的体积不多,还可以省下一次网络请求;但当文件体积比较大时,会影响网站初次加载和渲染的速度(解码base64大文件也会消耗性能),这种时候文件还是放CDN比较好。
为什么base64补0只有两种情况?
考虑另一个限制条件:在操作系统中,文件系统进行读写操作,都是以字节为单位来操作的,而一个字节等于8bit,因此,base64的编码对象,其二进制位数都是8的倍数,而base64编码是每次从中取出6bit来编码,这就可能在二进制串的末尾出现除不尽的情况——有且仅有两种情况:
1. 剩1个字节待编码,从中取出6bit之后,剩2bit尚未编码(8 - 6 = 2),这时需要补4位0。
2. 剩2个字节待编码,从中取出12bit之后,剩4bit尚未编码(8*2 - 6*2 = 4),这时需要补2位0。
剩3个字节时,正好对应4个6bit,不需要补0。
所以我们可能在Base64串尾部看到1或2个等号,就是这样来的。
Base64与URI编码的异同
相同点:它们都是用给定的字符集去表示更广范围数据的方法。
区别:URI编码是针对超出URI合法字符集(是ASCii可显示字符集的子集,去掉了不安全字符和保留字符)范围外的字符做编码,而base64是针对二进制数据做编码——一个是对文本的编码,一个是对二进制数据的编码。
两个Tips
1. 文本本质上也是二进制数据,因此也可以强行拿来做base64编码
2. base64编码中的斜杠号/和等号=不属于URI合法字符,故base64编码串不能直接带在链接参数上
针对base64编码和URIEncode的一点研究的更多相关文章
- 对JSON传递图片Base64编码的一点总结
项目中跟Java对接的时候需要传输图片,经过Base64编码后传输的. 但是实际调试的时候发现Java那边始终无法正常解析出图片. 冷静想想之后,发现问题在于使用OpenCV读取图片,编码的是Mat: ...
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
NET MVC全局异常处理(一) 目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...
- 减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术)
在网站开发过程中,对于页面的加载效率一般都想尽办法求快.那么,怎么让才能更快呢?减少页面请求 是一个优化页面加载速度很好的方法.上一篇博文我们讲解了 “利用将小图标合成一张背景图来减少HTTP请求”, ...
- 详解Base64编码和解码
Base64是最常用的编码之一,比如开发中用于传递参数.现代浏览器中的<img />标签直接通过Base64字符串来渲染图片以及用于邮件中等等.Base64编码在RFC2045中定义,它被 ...
- JavaScript:详解 Base64 编码和解码
Base64是最常用的编码之一,比如开发中用于传递参数.现代浏览器中的<img />标签直接通过Base64字符串来渲染图片以及用于邮件中等等.Base64编码在RFC2045中定义,它被 ...
- 20202405李昕亮《BASE64编码》
BASE64编码 20202405李昕亮 参考网址: 1.https://baike.baidu.com/item/base64/8545775?fr=aladdin 2.https://blog.c ...
- Android数据加密之Base64编码算法
前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...
- [编解码] 关于base64编码的原理及实现
转载自: http://www.cnblogs.com/hongru/archive/2012/01/14/2321397.html [Base64]-base64的编码都是按字符串长度,以每3个8b ...
- Base64编码原理与应用
本文内容转自网络,如需详细内容,请参考相关网址. http://my.oschina.net/goal/blog/201032 代码参考:http://blog.csdn.net/prsniper/a ...
随机推荐
- 【Android - IPC】之Binder机制简介
参考资料: 1.<Android开发艺术探索>第二章2.3.3 Binder 2.[Android Binder设计与实现-设计篇] 3.[Android Binder机制介绍] 1. 什 ...
- 10-kubernetes serveraccount RBAC
目录 认证安全 serviceAccountName 和 userAccount serviceaccount 创建 使用admin 的SA 测试 URL访问kubernetes资源 APIserve ...
- VS2019提示scanf不安全问题
VS2019提示scanf不安全问题 我们现在学的就是使用scanf()语句进行输入,但是vs2019中却报错显示不安全 首先我先来说一下scanf和scanf-s的区别 scanf()函数是标准C中 ...
- Spring Boot应用启动的三种方式
Spring Boot应用HelloWorld的三种启动方式: 项目的创建可以在http://start.spring.io/网站中进行项目的创建. 首先项目结构: 1. 通过main方法的形式启动 ...
- 深入浅出-iOS程序性能优化
iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象.还记得12306么,那个速度,相信大家都受不 ...
- PAT(甲级)2019年秋季考试
第一题用搜索,超时了,待补 更新第一题思路 dfs + 剪枝,首先确定 n的最后一位数字肯定是9,为什么呢,因为 任意两个相邻的数肯定互为质数(gcd=1),所以 n 的末尾肯定是9,这样n+1产生的 ...
- [UWP]使用CompositionGeometricClip裁剪复杂图形及进行动画
1. UWP中的其它裁剪方案 之前在 这篇文章 里,我介绍了如何使用UIElement.Clip裁剪UIElement的内容,使用代码如下: <Canvas> <Image Sour ...
- Python装饰器总结,带你几步跨越此坑!
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...
- python BeautifulSoup4 获取 script 节点问题
在爬取12306站点名时发现,BeautifulSoup检索不到station_version的节点 因为script标签在</html>之外,如果用‘lxml’解析器会忽略这一部分,而使 ...
- hadoop format 重新格式化
前文:如果格式化完之后,使用jps命令发现进程都已经启动,但是使用web页面打不开hadoop的网页,可能原因就是防火墙没关或者是哪个配置过程配错了. 1.关闭防火墙 一般最好是关闭防火墙比较关闭. ...