在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