You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
asyncfunctionread2JSON(){// let ret = await fs.readFile(path.resolve(__dirname, '2.txt'))// 读取图片letret=awaitfs.readFile(path.resolve(__dirname,'../assets/encoding-base64-example.png'))console.log(ret.toJSON())returnret.toJSON()}
目录
进制间的转换
编码发展历史
base64编码
如何实现base64
小结
前言
日常工作中,频繁的使用base64取代小图标,以便减少HTTP请求进而达到性能优化的目的。基于此来聊聊编码的发展、为什么需要base64以及如何实现base64。此文章首发于聊聊编码那些事,顺带实现base64转载请注明来源。
进制间的转换
对任意进制的数进行任意进制转换
Number.prototype.toString(radix)
将任意进制数转换为十进制数
parseInt(string, radix)
几道关于parseInt的面试题
说到parseInt,不得不提到一个很有意思的面试题
map
方法第一个参数为函数,函数有三个参数,array.map((item, index, array) => { ... })
实际上相当于
再来看一个类似的面试题
replace
方法第二个参数若是一个函数,函数会有若干个参数。第一个为匹配模式的字符串;第二个为与模式中子表达式匹配的字符串,可以有零个或多个这样的参数。实际上相当于如下
其实在
mdn
中对parseInt/map/replace
已经讲解的很详细,期望大家在工作之余不要太过浮躁,别做伸手党,静下心来啃一下文档并多做实践,很多面试题自然会迎刃而解。编码发展历史
ASCII
GBK2312
GBK
GB18030/DBCS
Unicode
UTF-8
现在的标准,有如下特点
base64编码
为什么需要base64
在开发时,经常会有一些小图标图片,每一个图片都会有一次HTTP请求,由于浏览器对同一个域名的并发数量有限制,所以我们应该尽可能减少HTTP请求个数。
本文主要讲解编码相关,那就只讲解从编码入手如何去减少HTTP请求。
在计算机内部,任何信息最终都是使用一系列二进制存储,图片也不例外。
而且在
img
标签的src
属性后跟上一个base64
字符,如果该字符有效,那么会正常显示图片。如何实现base64
以下涉及的所有代码均在仓库中,感兴趣的可以自取。
读取buffer转为json对象
首先准备一个
2.txt
文件。case.js代码
上面的依赖mz/fs已经将
fs
都包装成promise
,所以我们能写的更像同步。readFile
函数如果第二个参数没有指定会读取成一个buffer
流,是由一个个16进制
数组合在一起的。buffer.toJSON可以将一个buffer流转为一个json对象,十六进制也会被转十进制。如上输出所示。
将10进制转为2进制
十进制转为二进制可以通过
Number.toString(2)
方法将2进制拼一起3*8然后分隔成4*6
一个汉字在
UTF-8
规范中由三个字节组成,一个字节由8
个二进制物理位构成。所以一个汉字实际占用内存3*8
,base64
中我们实际需要6
个物理位表示一个字节即2**6
,所以做重新分割4*6
。然后将2进制转成10进制
二进制转为十进制可以通过
parseInt(string, 2)
方法base64码
base64
中的64
实际上是根据2**6
所来,表示则由大写字母、小写字母、数字、+/
构成。取到每一个base64码
然后我们则可以取到每一个
base64
码我们可以前往base64在线转码解码进行验证。
简化代码
对以上思路进行代码简化
小结
如上我们可以实现将中文转为base64,同理我们也可以转换图片。
特别的: 由于将2进制拼一起3*8然后分隔成4*6,原来存储一个汉字需要三个字节,现在需要四个字节存储,所以转换为
base64
后会比之前大3/1
。下面笑脸图片则是由
img的src属性展示的
(github似乎将base64过滤了,并没有展示),不过本文并没有实现图片转base64,因为其逻辑较为复杂,但是本文讲解了大致思路,感兴趣的可再做深究。The text was updated successfully, but these errors were encountered: