详解编码在Buffer中的应用,不了解的赶紧来学习一下

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中提供的方法!

喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191121A05WWL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动