主题
编码的发展以及进制的转换
1. 为什么要掌握编码
在服务端,做的最多的就是文件操作,比如读取一个文件,操作一个文件,接收请求等等。 我们要知道,我们操作的这些东西,其实都是二进制类型的。比如,读取一个文件,我们看到的都是utf8,但是在真正读取过程中,肯定都是以二进制来读取的,包括文件上传,上传一个图片,txt,excel等等,都是以二进制来传递到后端的。
现在不关只有后端能操作二进制,其实前端也可以。前端也提供了H5的写文件方法
我们掌握一些编码的概念,因为若是涉及到进制,肯定就要进行转化,进行转化肯定就会涉及到编码,虽然现在基本都是utf8,但是是进阶的必经之路。
2. 编码的发展
2.1 常用的编码
开发过程中,都是以字节
为单位,字节也是开发中最小的单位。但是比字节更小的单位是bit位
(也就是我们常说的位),一个字节由8个bit位组成
一般常见的一个字节可以组成一个字符,还有双字节的组成汉字,比如gbk编码的,uft8的三个字节组成一个汉字,等等。。
因此,到底多少个字节才能组成字符或汉字等,还得看具体是什么编码。
常用的编码如下: ASCII编码 GB2312 GBK GB18030 Unicode UTF-8
每个字节由8个位组成,每一个位里面存的都是二进制。但是不管是二进制还是其他进制,只是标线的形式不同,其实最终要表示的含义是一样的。
二进制,要么是0,要么是1。 一个字节最大值是8个位里面都是1,换算成10进制就是255,所以,一字节的最大十进制值是255,
Node中不支持GBK编码,我们需要将GBK转为UTF8编码
js
var iconv = require('iconv-lite');
function readGBKText(pathname) {
var bin = fs.readFileSync(pathname);
return iconv.decode(bin, 'gbk');
}
3. 进制的转换
3.1 常用的进制
10进制:我们生活中平时用的都是10进制,缝10进1 2进制:缝2进1,以0b开头,例如:0b11 8进制:缝8进1,以0o开头,例如:0o666 16进制:以0x开头,例如:0x16
js中提供了进制转换的方法
3.2 把任意进制转成十进制
js
console.log(parseInt('20',10));//20
console.log(parseInt('11',2));//3
console.log(parseInt('20',16));//32
3.2把十进制转成任意进制
js
console.log((3).toString(2));//11
console.log(3..toString(2));//11
console.log((77).toString(8));//115
console.log((77).toString(16));//4d
console.log((17).toString(8));//21
3.3 把任意进制转换成任意进制
js
// 将10进制转换成其他进制(注意有两个点)
3..toString(8) // 10进制的3转换成8进制
(0x16).toString(2) // 将16进制的16转成2进制
4. Node中体现
node中需要进行文件读取,node中操作的内容默认会存在内存中,内存中的表现形式肯定是二进制的。我们需要将二进制转换成16进制来呈现。
因为16进制表现的比较短,Buffer就是16进制。