Node.js系列:Buffer类的使用

客户端JavaScript中没有对二进制数据提供很好的支持。但是在处理TCP流或文件流时,必须要处理二进制数据。Node.js定义了一个Buffer类,用来创建一个专门存放二进制数据的缓存区。

Buffer中存的数据默认为16进制。

1、创建Buffer对象

在Node.js中,Buffer类是一个可以在任何模块中不使用的全局类,不要单独加载。可以使用New关键字来创建该类的实例对象。

Buffer类有三种形式的构造函数:

第一种:将缓存区大小(以字节为单位)作为构造函数的参数

var size = 128; //缓存区大小单位字节

var buf = new Buffer(size);

此时被创建的Buffer对象有一个length属性,属性值为缓存区大小。

console.log(size); //128

可以使用Buffer对象的fill()函数来初始化缓存区中的所有内容:

buf.fill(value,[offset],[end]);

ps:

value 必须参数,参数值是需要被写入的数值。

[offset] 可选参数,默认为0,用于指定从第几个字节处开始写入被指定的数值

[end] 可选参数,用于指定数值一直写入到第几个字节处,默认值为Buffer对象的最大值

例子:

1、声明缓存区实例,并在第10个字节的位置输入1,直到末尾。

2、在第20~30字节之间,写入2

buf = new Buffer(128);

buf.fill(1,10);

buff.fill(2,20,30);

第二种:直接使用一个数组来初始化缓存区。

var buf = new Buffer(Array);

这种形式的构造函数中,使用了一个存放需要被指定数值的数组来作为构造函数的参数。

var arr = [1,2,3];

var buf = new Buffer(arr);

console.log(buf); //

第三种:直接使用一个字符串来初始化缓存区。

var str = "你好";

var buf = new Buffer(str,[encoding]);

ps:

str:必须参数,参数值用于初始化缓存区,

[encoding]:可选参数,用于指定字符串文字编码格式,默认为"utf8"

Node.js中可以使用的编码:

ascii : ASCII字符串

utf8 : UTF-8字符串

utf16le : UTF-16LE字符串

usc2 : USC2字符串

base64 : 经过BASE64编码后的字符串

binary : 二进制数据(不推荐使用)

hex : 使用十六进制数值表示的字符串

2、字符串的长度与缓存区的长度

Node.js中,一个字符串长度与根据该字符串创建的缓存区的长度并不相同。计算字符串长度时,以文字作为单位;计算缓存区长度时,以字节作为单位。

Buffer对象用slice()函数取出指定位置处的数据,该方法的使用与string对象的slice方法相同。slice()函数并不是复制缓存区的数据而是共享数据,因此,一旦修改了slice()函数取出的数据,则缓存区中保存的数据也将被修改。

3、Buffer对象与字符串对象之间的相互转换

Buffer 对象的toString方法可以将Buffer对象中保存的数据转换为字符串:

var str = "我喜爱编程";

var buf = new Buffer(str);

buf.toString([encoding],[start],[end]);

[encoding]:指定Buffer对象中保存的文字编码格式,默认值为utf8;

[start]:指定被转换数据的起始位置,以字节为单位

[end]:指定被转换数据的终止位置,以字节为单位

实例:

var str = "我喜爱编程";

var buf = new Buffer(str);

buf.toString("utf8",9,12); //编

buf.toString("utf8",12,buf.length); //程

Buffer对象的write方法,用于向已经创建的Buffer对象中写入字符串。

var str = "我喜爱编程";

var buf = new Buffer(str);

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

string:必须参数,用于指定需要写入的字符串

[offset]:指定字符串转换位字节数据后的写入位置

[length]:指定字符串转换位字节数据后的写入位置

[encoding]:指定写入字符串时使用的编码格式,默认为utf8;

字节数据的书写位置从第1+offset个字节开始,到offset+length为止。

var str = "我喜爱编程";

var buf = new Buffer(str);

buf.write("热",3,3); //3

buf.toString(); //我热爱编程

StringDecoder对象,可以将Buffer对象中的数据转换为字符串,该对象的作用与Buffer对象的toString()函数的作用相同,但是对于utf8编码格式的字符串提供更好的支持。在使用StringDecoder对象时,首先需要加载Node.js中的string_decoder模块。

加载模块

varstringDecoder=require("string_decoder").StringDecoder;

实例化对象

var decoder = new StringDecoder([encoding]);

使用该对象的write()函数可以将Buffer对象中的数据转换位字符串

decoder.write(buffer);

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

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

var str = "我喜爱编程";

var buf = new Buffer(str);

var json = JSON.stringify(buf);

var parseArr = JSON.parse(json);

var copy = new Buffer(parseArr);

console.log(copy.toString()); //我喜爱编程

5、复制缓存数据

当需要将Buffer对象中保存的数据复制到另一个Buffer对象中时,可以使用Buffer对象的copy方法。

var str = "我喜爱编程";

var buf = new Buffer(str);

buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd]);

targetBuffer:必选参数,用于指定复制的目标Buffer对象

[targetStart]:可选参数,用于指定从目标Buffer对象中从第几个字节开始写入数据,默认值为0

[sourceStart]:可选参数,指定从复制源Buffer对象中获取数据时的开始位置,默认0

[sourceEnd]:可选参数,指定从复制源Buffer对象中获取数据的结束位置,默认为复制Buffer对象的长度

var buf_a = Buffer("我喜爱编程");

var buf_b = Buffer(128);

buf_b.fill(0);

buf_a.copy(buf_b,10);

6、Buffer类的类方法

Node.js为Buffer类定义了三个类方法:

isBuffer(),用于判断一个对象是否为一个Buffer对象

语法:Buffer.isbuffer(obj);obj参数用于指定需要被判断的对象,如果对象为Buffer对象,方法返回true,否则返回false

var a = "aaa";

var b = Buffer(10);

Buffer.isBuffer(a);

Buffer.isBuffer(b);

byteLength(),用来计算一个指定字符串的字节数

语法:Buffer.byteLength(string,[encoding]);

string:必须参数,用于指定计算字节数的字符串

[encoding]:可选参数,用于指定按什么编码方式来计算字节数,默认utf8;

concat(),将几个Buffer对象结合创建为一个新的Buffer对象。

语法:Buffer.concat(list,[totalLength]);

list:必须参数,参数值为一个存放了多个Buffer对象的数组;

totalLength:可选参数,用于指定被创建的Buffer对象的总长度,当省略该参数时,被创建的Buffer对象为第一个参数数组中所有Buffer对象的长度的合计值。

如果第一个参数为空数组,或第二个参数等于0,那么concat方法返回一个长度为0的Buffer对象。

如果第一个参数数组中只有一个Buffer对象,那么concat方法直接返回该Buffer对象。

如果第一个参数值数值中拥有一个以上的Buffer对象,那么concat方法返回被创建的Buffer对象。

isEncoding(),用于检测一个字符串是否为一个有效的编码格式字符串;

语法:Buffer.isEncoding(encoding);

str1 = "utf16le";

Buffer.isEncoding(str1); //true

时间: 2024-08-09 06:18:09

Node.js系列:Buffer类的使用的相关文章

node.js的Buffer类

1.创建 创建一个长度为256的Buffer实例:var buf = new Buffer(256); 创建一个数组:var buf = new Buffer([10, 20, 30, 40, 50]); 创建一个字符串:var buf = new Buffer("12345", "utf-8");utf-8为编码方式,还有"ascii", "utf8", "utf16le", "ucs2&quo

笔记:Node.js 的 Buffer 缓冲区

笔记:Node.js 的 Buffer 缓冲区 node.js 6.0 之前创建的 Buffer 对象使用 new Buffer() 构造函数来创建对象实例,但权限很大,可以获得敏感信息,所以建议使用 buffer.from() 接口创建 Buffer 对象. Buffer 实例要以通过显式字符编码与普通的字符串之间进行相互转换,支持 assii,utf8,utf16le,ucs2-utf16le,base64,latin1,binary-latin1,hex. 写稿缓冲区(buf.write)

【node.js】Buffer(缓冲区)

Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区. 创建 Buffer 类 Node Buffer 类可以通过多种方式来创建. 1.创建长度为 10 字节的 Buffer 实例: var buf = new Buffer(10); 2.通过给定的数组创建 Buffer 实例: var buf = new Buffer([10, 20, 30, 40, 50]); 3.通过一个字符串来创建 Buffer 实例: var buf = new Buffer("

Node.js API —— Buffer(缓冲区)

// 说明 Node API 版本为 v0.10.31.    中文参考:http://nodeapi.ucdok.com/#/api/,http://blog.sina.com.cn/oleoneoy 本段为博主注解. 目录 ● 缓冲区    ○ Class: Buffer ■ new Buffer(size)       ■ new Buffer(array)       ■ new Buffer(str, [encoding])       ■ Class Method: Buffer.i

Node.js之Buffer

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型.但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库,一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存. 创建 Buffer 对象(3种方式) var buf = n

node.js中Buffer缓冲器的使用

一.什么是Buffer Buffer缓冲器是用来存储输入和输出数据的一段内存.js语言没有二进制数据类型,在处理TCP和文件流的时候,就不是很方便了. 所以node.js提供了Buffer类来处理二进制数据,Buffer类是一个全局变量,Buffer在创建的时候大小就固定了,无法改变. Buffer类的实例类似于由字节元素组成的数组,可以有效的表示二进制数据. 二.什么是字节 字节是计算机存储时的一种计量单位,一个字节等于8个位.一个位就代表0或1,每8个位(bit)组成一个字节(byte).

Node.js 系列01

百度百科上: Node.js是一套用来编写高性能网络服务器的JavaScript工具包,一系列的变化由此开始,在Node中,Http是首要的.Node为创建http服务器作了优化,所以在网上看到的大部分示例和库都是集中在web上(http框架.模板库等). Node.js的优点 nodejs作为一个新兴的后台语言,有很多吸引人的地方: RESTful API 单线程 Node.js可以在不新增额外线程的情况下,依然可以对任务进行并行处理 —— Node.js是单线程的.它通过事件轮询(event

Node.js系列02

1.Node.js 中 moudle.exprots 的用法: 如果暴露一个类, 就用module.exprots . 1 /** 2 * Created by aytsoft on 2016/4/25. 3 */ 4 /*如果是暴露一个类 就用moudle.exprots = 类名*/ 5 function Pepole(name, age){ 6 this.name = name; 7 this.age = age; 8 9 } 10 Pepole.prototype = { 11 cons

Node.js的Buffer那些你可能不知道的用法

在大多数介绍Buffer的文章中,主要是围绕数据拼接和内存分配这两方面的.比如我们使用fs模块来读取文件内容的时候,返回的就是一个Buffer: fs.readFile('filename', function (err, buf) { // <Buffer 2f 2a 2a 0a 20 2a 20 53 75 ... > }); 在使用net或http模块来接收网络数据时,data事件的参数也是一个Buffer,这时我们还需要使用Buffer.concat()来做数据拼接: var bufs