Node.js中的Buffer对象详解编程语言

在ES6之前,客户端js脚本代码对于二进制数据并没有提供一个很好的支持。在处理TCP流或文件流的时,必须要处理二进制数据。因此在Node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区

创建Buffer对象

在Node.js中,Buffer类是一个可以在人员和模块中被利用的全局类,不需要另外加载任何模块。Buffer类拥有三种形式的构造函数,第一种只需将缓存区大小(以字节为单位)指定为构造函数的参数

   new Buffer(size)

被创建的Buffer对象拥有一个length属性,属性值为缓存区大小。
可以使用Buffer对象的fill方法来初始化缓存区的所有内容,第一个参数为需要被写入的数值,是必须指定的,第二个和第三个参数为可选参数。其中第二个参数用于指定从第几个字节处开始写入被指定的数值,默认值是0。第三个参数用于指定将数值一致写入到第几字节处。

   var buf = new Buffer(128); 
   buf.fill(1, 0, 30);

Buffer类的第二种形式构造是直接使用一个数组来初始化缓存区

   new Buffer(array)

Buffer类的第三种形式的构造函数是直接使用一个字符串来初始化缓存区

   new Buffer(str, [encoding]); 
   //第二个参数用于指定文字编码,默认为utf-8 
   new Buffer('hello')

字符串长度与缓存区长度

在Node.js中,一个字符串的长度与根据该字符串所创建的长度并不相同,因为在计算字符串长度时以文字做为一个单位,而在计算缓存区长度时以字节作为一个单位。
在REPL环境中输入以下命令

   > str = '你好' 
   > buf = new Buffer(str); 
   > <Buffer e4 bd a0 e5 a5 bd> 
   > str.length 
   > 2 
   > buf.length 
   > 6

针对一个引用了字符串对象的str对象来说,str[2]获取的是第三个文字,而针对一个引用了缓存区对象的buf变量来说,buf[2]获取的是缓存区中第三个字节数据转换成整数后的数值。另外,Buffer对象是可以被修改的,而字符串不能

   > str = '早上好' 
   > str[0] = '晚' 
   > str 
   > '早上好'

Buffer对象并没有像字符串一样拥有众多方法,唯一的方法slice与字符串对象的slice方法使用相同,不同的是slice之后的值保存了原来Buffer对象一样的引用。

Buffer对象的toString方法

   buf.toString([encoding], [start], [end]) 
   > buf = new Buffer('早上好') 
   > buf.toString('utf8', 3, 6); 
   > '上'

Buffer对象的write方法

如果要将字符串当作二进制数据来使用,只需要将该字符串做为Buffer类的构造函数的参数来创建Buffer对象即可。但是有时我们需要将已经创建的Buffer对象写入字符串,这时需要用到write方法

   buf.write(string, [offset], [length], [encoding]) 
   > buf = new Buffer('早上好') 
   > <Buffer e6 97 a9 e4 b8 8a e5 a5 bd> 
   > buf.write('晚',0,3); 
   > buf.toString(); 
   > '晚上好'

还可以通过StringDecoder对象将Buffer对象中的数据转换成字符串,比toString更方便进行批量操作

Buffer对象与数值对象之间的转换

我们以readUInt8(读取缓存区中的8位无符号整数)为例读取缓存中的一些数据

   > buf = new Buffer([0x00, 0x10, 0x20, 0x30]); 
   > buf.readUInt8(0) //读取缓存区中第1个字节出的无符号整数 
   > 0 
   > buf.readUInt8(1) //读取缓存区中第2个字节出的无符号整数 
   > 16 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/13492.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论