首页 > 语言 > JavaScript > 正文

node.JS二进制操作模块buffer对象使用方法详解

2024-05-06 15:44:10
字体:
来源:转载
供稿:网友

在ES6引入TypedArray之前,JavaScript语言没有读取或操作二进制数据流的机制。Buffer类被引入作为Nodejs的API的一部分,使其可以在TCP流和文件系统操作等场景中处理二进制数据流。现在TypedArray已经被添加进ES6中,Buffer类以一种更优与更适合Node.js用例的方式实现了Uint8Array。

Buffer对象概述

由于应用场景不同,在Node中,应用需要处理网络协议、操作数据库、处理图片、接收上传文件等,在网络流和文件的操作中,还要处理大量二进制数据,JavaScript自有的字符串远远不能满足这些需求,于是Buffer对象应运而生

Buffer是一个典型的JavaScript与C++结合的模块,它将性能相关部分用C++实现,将非性能相关的部分用JavaScript实现。Buffer类的实例类似于整数数组,除了其是大小固定的、且在V8堆外分配物理内存。Buffer的大小在其创建时就已确定,且不能调整大小

由于Buffer太过常见,Node在进程启动时就已经加载了它,并将其放在全局对象(global)上。所以在使用Buffer时,无须通过require()即可直接使用

/*{ [Function: Buffer] poolSize: 8192, from: [Function], alloc: [Function], allocUnsafe: [Function], allocUnsafeSlow: [Function], isBuffer: [Function: isBuffer], compare: [Function: compare], isEncoding: [Function], concat: [Function], byteLength: [Function: byteLength] } */console.log(Buffer);

创建Buffer对象

在 Node.js v6之前的版本中,Buffer实例是通过Buffer构造函数创建的,它根据提供的参数返回不同的 Buffer,而新版本的nodejs则提供了对应的方法

1、new Buffer(size)。传一个数值作为第一个参数给Buffer()(如new Buffer(10)),则分配一个指定大小的新建的Buffer对象

分配给这种Buffer实例的内存是未初始化的(没有用0填充)。虽然这样的设计使得内存的分配非常快,但已分配的内存段可能包含潜在的敏感旧数据

这种Buffer实例必须手动地被初始化,可以使用buf.fill(0)或写满这个Buffer。虽然这种行为是为了提高性能而有意为之的,但开发经验表明,创建一个快速但未初始化的Buffer与创建一个慢点但更安全的Buffer之间需要有更明确的区分

var buf = new Buffer(5);console.log(buf);//<Buffer e0 f7 1d 01 00>buf.fill(0);console.log(buf);//<Buffer 00 00 00 00 00>

[注意]当我们为一个Buffer对象分配空间大小后,其长度就是固定的,不能更改

var buf = new Buffer(5);console.log(buf);//<Buffer b8 36 70 01 02>buf[0] = 1;console.log(buf);//<Buffer 01 36 70 01 02>buf[10] = 1;console.log(buf);//<Buffer 01 79 43 6f 6e>

Buffer.allocUnsafe(size)

 在新版本中,由Buffer.allocUnsafe(size)方法替代,来分配一个大小为 size 字节的新建的没有用0填充的Buffer。可以使用buf.fill(0)初始化Buffer实例为0

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选