您的位置:首页 > Web前端 > Node.js

node.js学习笔记之Buffer类

2017-07-26 19:22 489 查看
Buffer 类的实例类似于整数数组,但 Buffer 的大小是固定的、且在 V8 堆外分配物理内存。 Buffer 的大小在被创建时确定,且无法调整。
Buffer 类在 Node.js 中是一个全局变量,因此无需使用 require('buffer').Buffer。

Buffer有三种形式的构造方法:

1、以字节为单位指定构造函数的参数

new Buffer(size)

被创建的Buffer对象有一个length属性,如下所示

> buf = new Buffer(32);
<Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>
> buf.length
32
> 可以使用Buffer对象的fill方法来初始化缓冲区的内容
buf.fill(value,[offset],[end])

第一个参数表示要被写入的数值(必填),第二个参数指定从第几个字节处开始写入被指定的值,默认为0(选填),第三个指定将数值一直写到第几个字节出,默认为buffer对象长度(选填)。
> buf = new Buffer(64);
<Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... >
> buf.fill(3);
<Buffer 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 ... >
> buf.fill(8,8,16);
<Buffer 03 03 03 03 03 03 03 03 08 08 08 08 08 08 08 08 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 ... >
>2、使用一个数组来初始化一个Buffer缓冲区
new Buffer(array)

> buf = new Buffer([1,2,3,4]);
<Buffer 01 02 03 04>3、使用一个字符串来初始化缓冲区
new Buffer(str,[encoding])

第一个参数为用于初始化缓冲区的字符串(必填)

第二个参数为一个用于指定文字编码的字符串,默认为“utf”(选填)

> str = '我喜欢编程'
'我喜欢编程'
> buf = new Buffer(str);
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>4、Buffer对象的toString方法
可以将Buffer中的数据转换成字符串,格式如下:

buf.toString([encoding],[start],[end])
三个参数皆可选。第一个参数指定保存的编码格式,默认为utf8,第二和第三个参数用于指定被转换数据的起始和终止位置,以字节为单位。

> buf = Buffer('我喜爱编程');
<Buffer e6 88 91 e5 96 9c e7 88 b1 e7 bc 96 e7 a8 8b>
> buf.toString('utf8',9,12);
'编'
> buf.toString();
'我喜爱编程'
>5、Bufer对象的write方法
如果我们想要在已将创建好的Buffer对象中写入字符串,就需要使用write方法,格式如下:

buf.write(string,[offset],[length],[encoding])

第一个为必须指定参数,后面三个为可选参数。第一个参数指定需要写入的字符串,第二和第三个为需要写入的位置和长度。第四个参数指定写入时的编码格式,默认为utf8.

> buf = Buffer('我喜爱编程');
<Buffer e6 88 91 e5 96 9c e7 88 b1 e7 bc 96 e7 a8 8b>
> buf.write('热',3,3);
3
> buf.toString();
'我热爱编程'
>6、buffer对象与数值对象之间的转换
由于方法太多,且都大同小异,再此就不演示了。放上图



上述read方法均把Buffer对象中的数据读取为Number类型的数据。第一个参数(offset)用于指定获取数据的起始位置,以字节为单位。第二个参数为一个布尔型的可选参数,用于指定是否对offset的值进行验证。默认为false,当参数为false时,如果offset超出了缓冲区的长度,则会抛出异常。参数值为true时不抛出异常。



上述write方法均用于将Number类型的数据转换为指定数据类型后写入到缓冲区中。

第一个参数为需要写入的数据,第二个参数offset用于指定数据的起始位置,以字节为单位。第三个参数noAssert为一个布尔型可选参数,用于指定是否对offset的值进行验证。默认为false,当参数为false时,如果offset超出了缓冲区的长度,则会抛出异常。参数值为true时不抛出异常。

7、Buffer对象与JSON对象间的相互转换

在nide.js中,可以使用JSON.stringify方法将Buffer对象中保存的数据转换为一个字符串,也可以使用JSON.parse将一个经过转换后的字符串还原为一个数组。

> buf
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> json = JSON.stringify(buf);
'{"type":"Buffer","data":[230,136,145,229,150,156,230,172,162,231,188,150,231,168,139]}'
> copy = new Buffer(JSON.parse(json));
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> copy.toString();
'我喜欢编程'8、复制缓存数据
buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd])
第一个为必须指定参数,其余为选填参数

第一个参数指定复制的目标Buffer对象,第二个参数指定从目标对象第几个字节写入数据,默认为0.第三个和四个参数指定复制源Buffer对象获取数据时的开始位置和结束位置

> a = Buffer('我喜爱编程');
<Buffer e6 88 91 e5 96 9c e7 88 b1 e7 bc 96 e7 a8 8b>
> a.toString();
'我喜爱编程'
> b = Buffer(64);
<Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... >
> a.copy(b,8);
15
> b
<Buffer 00 00 00 00 00 00 00 00 e6 88 91 e5 96 9c e7 88 b1 e7 bc 96 e7 a8 8b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... >
>

9、buffer类的类方法
isBuffer方法,判断一个对象是否为Buffer对象

Buffer.isBuffer(obj)

参数obj指定需要被判断的对象,如果是Buffer对象,返回true,否则返回false

> a
<Buffer e6 88 91 e5 96 9c e7 88 b1 e7 bc 96 e7 a8 8b>
> str = 'I like node.js'
'I like node.js'
> Buffer.isBuffer(str);
false
> Buffer.isBuffer(a);
true byteLength方法:计算一个指定字符串的字节数
Buffer.byteLength(strign,[encoding])

第一个参数指定需要被计算字节数的字符串,(必填)。第二个为可选参数,用于指定什么编码来计算字节数,默认utf8.

> a
<Buffer e6 88 91 e5 96 9c e7 88 b1 e7 bc 96 e7 a8 8b>
> a.toString()
'我喜爱编程'
> Buffer.byteLength(a,'utf8')
15
> concat方法:将几个Buffer对象连接为一个Buffer对象。
> str1 = new Buffer('我');
<Buffer e6 88 91>
> str2 = new Buffer('和');
<Buffer e5 92 8c>
> str3 = new Buffer('你');
<Buffer e4 bd a0>
> var buffer = Buffer.concat([str1,str2,str3]);
undefined
> buffer.toString();
'我和你' isEncoding方法:用于检测一个字符串是否为一个有效的编码格式的字符串。
Buffer.isEncoding(encoding)

> str1 = 'utf16le'
'utf16le'
> str2 = 'utf16e'
'utf16e'
> Buffer.isEncoding(str1)
true
> Buffer.isEncoding(str2);
false
>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: