Buffer简介
因为先前JavaScript没有操作二进制数据流的能力,所以后来Nodejs就将Buffer引入了进来!Buffer在Node环境下是全局模块,不需要用require做额外的引入操作。
前面一篇文章《JS操作内存?二进制数组了解一下》介绍了二进制数组,Buffer类实现了二进制数组中Uint8Array的一些方法,Buffer的实例就相当于Uint8Array的实例!
Buffer中的编码
在Buffer的学习中,编码是比较难理解的一块,我们用Buffer.from来介绍这一块内容。Buffer主要支持以下几种编码:
ascii
utf8
utf16le(小端字符序)
base64
latin1
hex
先前几篇文章我们分析了以上几种编码的原理,ascii、utf8和utf16le是将字符串编码为二进制,base64、latin1和hex是将二进制解码为字符串!可以参考文章《一文搞清楚unicode字符集的三种实现方式》和《详解base64和latin1的编码原理》。
了解了以上的知识点后,我们在终端打开一个Node环境开始写demo分析一番!
ASCII编解码
demo1
demo1中我们用ascii将字符串abcd编码成二进制,用toString方法解码成字符串
编码成功
用ascii和utf8(默认)都能解码成功,因为utf8是兼容ascii的
utf16le解码失败,因为utf16不兼容ascii
demo2
demo2中我们用ascii将两个汉字编码成二进制
虽然生成了Buffer实例,但是“中文”两个字编码是错误的,因为ascii不支持中文的编码
解码自然也就无法成功
utf8和utf16le编解码
demo3
demo3中我们用默认的utf8编码方式
编码成功,utf8支持中文编码
utf8(默认)解码成功
utf16le解码失败,因为utf8和utf16是完全不同的两种编码方式,也不兼容
这个例子换成utf16le编码,用utf8解码也一样会失败,道理是一样的
base64和latin1编解码
这两种方式在应用中都是将二进制转化为字符串的
demo4
编码成功,目标就是把字符串变成二进制,用ascii、utf8或者utf16都可以
base64和latin1将二进制转化为字符串成功(必定会成功,前者在字节数不是3的倍数时会用0和等号填充,后者又是单字节编码)
在Buffer中也可以用base64和latin1将字符串转化为二进制,
demo5
demo5将demo4中字符串又转化为了二进制,如果字符串超出了它们的字符索引表的范围,它们是无法转化成功的,如下:
demo6
hex编解码
hex也可以将二进制转化为字符串
demo7
hex主要是将16进制的数字直接变成字符串
将字符串转化回二进制也是可以的,但是有一些限制
限制如下:
demo8
字符串的个数一定要是偶数个,否则会报错
字符串中的字符不能超出0~9 a~f A~F的范围,否则会被截断
总结
在Buffer中使用编码有如下规则:
将字符串转化为二进制时,字符串不能超出编码方式的范围,否则转化会失败,所以选择合适的编解码方式很重要;
编码和解码的方式最好是一致的(至少需要兼容),否则会失败
ascii、utf8和utf16主要是将字符串转化为二进制,base64、latin1和hex主要是将二进制转化为字符串(反转也是可以的)
下一篇文章我们开始聊一聊Buffer中提供的方法!
喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!
领取专属 10元无门槛券
私享最新 技术干货