快捷搜索:  汽车  科技

nodejs 如何配置(深入浅出NodeJs之理解Buffer)

nodejs 如何配置(深入浅出NodeJs之理解Buffer)length,要写入的字节数offset,缓冲区偏移量,指定的话就从这个位置开始写入,不指定就默认为0使用buf.write方法来向缓冲区里写入数据,write的原型如下:buf.write用来向缓冲区中写入一个字符串,返回实际写入的字节数。参数含义如下:string,待写入的字符串对象

Buffer的使用场景

在Node中,应用需要处理网络协议、数据库操作、图片、接收上传文件等,在这些网络流和文件操作中,需要处理大量的二进制数据,而纯JavaScript无法处理这些二进制数据,buffer就是用来处理二进制数据。

nodejs 如何配置(深入浅出NodeJs之理解Buffer)(1)

Buffer是什么

原始数据保存在buffer实例中,一个buffer实例类似于数组。buffer的大小在建立时指定的不可更改。

buffer是一个全局类,不需要使用require来引入。Buffer代表一个缓冲区,存储二进制数据,是字节流。我们在网络传输时,就传输的这种字节流。写文件时,也是写的字节流。

字符串是有编码格式的,比如UTF-8。而Buffer是没有编码格式的。两者可以相互转换。转换时必须指定编码格式。

nodejs 如何配置(深入浅出NodeJs之理解Buffer)(2)

往缓冲区写数据

使用buf.write方法来向缓冲区里写入数据,write的原型如下:

nodejs 如何配置(深入浅出NodeJs之理解Buffer)(3)

buf.write用来向缓冲区中写入一个字符串,返回实际写入的字节数。参数含义如下:

  • string,待写入的字符串对象

  • offset,缓冲区偏移量,指定的话就从这个位置开始写入,不指定就默认为0

  • length,要写入的字节数

  • encoding,代谢如字符串的编码格式,默认为utf8

从缓冲区读数据

toString方法是读取数据的一个方法,Buffer在转换为字符串时,toString方法的第一个参数就是编码类型,支持常见的编码格式:

utf8,多字节编码的unicode字符,大多数文档和网页采用这种编码格式 ascii,8bit编码,一个字符占1个字节 utf16le,小端编码的unicode字符 utf16be,大端编码的unicode ucs2,unicode编码,每个字符占两个字节 base64,Base-64字符串编码 hex,每个字节编码为两个十六进制字符 假如你不确认某个编码格式是否正确,可以使用Buffer.isEncoding(encoding)方法来测试。

在使用Buffer的toString方法时,如果你不指定编码格式,则默认使用utf8来转换。toString原型:

nodejs 如何配置(深入浅出NodeJs之理解Buffer)(4)

第一个参数是编码格式,第二个是开始位置(0到buf.length-1),第三个是结束位置(不包含这个索引位置的数据)。

Buffer的操作

Buffer还支持切片、拷贝、拼接、比较等操作。

buf.slice([start[ end]])可以根据起止位置(不包含结束位置对应的数据)对一个缓冲区进行切片,返回一个新的Buffer对象,方便我们操作缓冲区的某个区域。但值得注意的是,这个切片是对原有缓冲区的引用,而不是副本,你对切片内容的修改,实际上修改的是原始的缓冲区。这个方法返回一个代表切片的Buffer对象。

buf.copy(targetBuffer[ targetStart][ sourceStart][ sourceEnd])可以将一个缓冲区指定区域的内容拷贝到另一个缓冲的指定区域。类似C语言里的memcpy。targetStart指定目标缓冲区的起始偏移,sourceStart指定源缓冲区的起始偏移,它们默认都是0;sourceEnd指定源缓冲区的结束位置,默认是源缓冲区的长度。实际复制时,会比较目标缓冲区的长度和待复制区域的长度,哪个小按哪个来,不会越界。

Buffer有一个类方法,concat(list[ totalLength]),可以将一串缓冲区拼接成一个。第一个参数list是一个缓冲区数组,第二是待拼接的缓冲区的总长度。如果你不提供totalLength,concat会自己遍历list中的缓冲区计算总长度,会有一点性能损失。这个方法返回拼接后的缓冲区。

看个示例代码,演示切片、拷贝和拼接的用法:

nodejs 如何配置(深入浅出NodeJs之理解Buffer)(5)

buf.equals(otherBuffer)判断当前缓冲区是否和另一个相等,相等时返回true。

buf.compare(otherBuffer)比较当前缓冲区和另一个缓冲区的大小,相等返回0,小于返回-1,大于返回1。

Buffer处理中文相关问题

像许多计算机的技术一样,都是从国外传播过来的。那些以英文作为母语的传道者们应该没有考虑过英文以外的使用者,所以你有可能看到如下这样一段代码在向你描述如何在data事件中连接字符串。

nodejs 如何配置(深入浅出NodeJs之理解Buffer)(6)

如果这个文件读取流读取的是一个纯英文的文件,这段代码是能够正常输出的。 但是如果是中文的话,就很有可能出现??的乱码。造成这个问题的根源在于data = trunk语句里隐藏的错误,在默认的情况下,trunk是一个Buffer对象。这句话的实质是隐藏了toString的变换的:

nodejs 如何配置(深入浅出NodeJs之理解Buffer)(7)

由于汉字不是用一个字节来存储的,导致有被截破的汉字的存在,于是出现乱码。解决这个问题有一个简单的方案,是设置编码集:

nodejs 如何配置(深入浅出NodeJs之理解Buffer)(8)

遗憾的是目前Node.js仅支持hex、utf8、ascii、binary、base64、ucs2几种编码的转换。对于那些因为历史遗留问题依旧还生存着的GBK,GB2312等编码,该方法是无能为力的。

通用的正确的拼接Buffer对象的形式如下:

nodejs 如何配置(深入浅出NodeJs之理解Buffer)(9)

nodejs 如何配置(深入浅出NodeJs之理解Buffer)(10)

如果你喜欢这篇文章,请留下你宝贵的“赞”!同时欢迎关注我们、与小编互动,更多科技资讯等你哦!

猜您喜欢: