详解nodeJS之二进制buffer对象

在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);

创建

在 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

var buf = Buffer.allocUnsafe(10); console.log(buf);//<Buffer 75 63 74 42 79 4c 65 6e 67 74> buf.fill(0); console.log(buf);//<Buffer 00 00 00 00 00 00 00 00 00 00>

【Buffer.alloc(size[, fill[, encoding]])】

在新版本中,使用Buffer.alloc(size)方法可以生成一个安全的buffer对象,参数size <Integer> 新建的 Buffer 期望的长度;fill <String> | <Buffer> | <Integer> 用来预填充新建的 Buffer 的值。 默认: 0;encoding <String> 如果 fill 是字符串,则该值是它的字符编码。 默认: 'utf8'

分配一个大小为 size 字节的新建的 Buffer 。 如果 fill 为 undefined ,则该 Buffer 会用 0 填充

var buf = Buffer.alloc(5); console.log(buf);//<Buffer 00 00 00 00 00>

2、new Buffer(array或buffer)。传一个数组或Buffer作为第一个参数,则将所传对象的数据拷贝到Buffer

var buf1 = new Buffer([1, 2, 3, 4, 5]); console.log(buf1);//<Buffer 01 02 03 04 05> var buf2 = new Buffer(buf1); console.log(buf2);//<Buffer 01 02 03 04 05>

【Buffer.from(array或buffer)】

在新版本中,由Buffer.from(array或buffer)方法替代

var buf1 = Buffer.from([1, 2, 3, 4, 5]); console.log(buf1);//<Buffer 01 02 03 04 05> var buf2 = Buffer.from(buf1); console.log(buf2);//<Buffer 01 02 03 04 05>

3、new Buffer(string[, encoding])。第一个参数是字符串,第二个参数是编码方式,默认是'utf-8'

var buf1 = new Buffer('this is a tést'); console.log(buf1.toString());//this is a tést console.log(buf1.toString('ascii'));//this is a tC)st var buf2 = new Buffer('7468697320697320612074c3a97374', 'hex'); console.log(buf2.toString());//this is a tést

Node.js 目前支持的字符编码包括:

'ascii' - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。 'utf8' - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。 'utf16le' - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。 'ucs2' - 'utf16le' 的别名。 'base64' - Base64 编码。当从字符串创建 Buffer 时,这种编码可接受“URL 与文件名安全字母表”。 'latin1' - 一种把 Buffer 编码成一字节编码的字符串的方式。 'binary' - 'latin1' 的别名。 'hex' - 将每个字节编码为两个十六进制字符。

【Buffer.from(string[, encoding])】

在新版本中,由Buffer.from(string[, encoding]方法替代

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyxxjd.html