<node.js中的buffer.copy方法使用说明_node.js
您的当前位置:首页正文

node.js中的buffer.copy方法使用说明_node.js

2023-12-05 来源:六三科技网

方法说明:

进行不同buffer之间的复制替换操作。

从源buffer复制数据 并替换到目标buffer的指定位置。

语法:

代码如下:buffer.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])

接收参数:

targetBuffer 目标buffer,执行复制替换的buffer

targetStart 目标buffer数据替换的起始位置

sourceStart 源buffer数据复制的起始位置

sourceEnd 源buffer数据复制的结束位置

例子:

在该例子中,提取了buf1 16 到 20之间的数据,将数据复制到buf2中,从buf2的 位置8开始替换。

代码如下:buf1 = new Buffer(26);buf2 = new Buffer(26);for (var i = 0 ; i < 26 ; i++) { buf1[i] = i + 97; // 97 is ASCII a buf2[i] = 33; // ASCII !}buf1.copy(buf2, 8, 16, 20);console.log(buf2.toString('ascii', 0, 25));

小编还为您整理了以下内容,可能对您也有帮助:

Buffer简单理解及常用方法介绍

javascript 中对数据处理都是以字符串的形式,而对于二进制数据就不便于处理,所以 Buffer 便是用于读取或操作二进制数据的对象。

通俗来说Buffer其实就是处理数据的方法,这点在官网文档里解释的很详细。
Buffer 是内存拷贝,而不是内存共享。

Buffer 占用内存被解释为一个数组,而不是字节数组。比如,new Uint32Array(new Buffer([1,2,3,4])) 创建了4个 Uint32Array,它的成员为 [1,2,3,4] ,而不是[0x1020304] 或 [0x4030201]。
注意:Node.js v0.8 只是简单的引用了array.buffer里的 buffer ,而不是克隆(cloning)。

介绍一个高效的方法,ArrayBuffer#slice() 拷贝了一份切片,而 Buffer#slice() 新建了一份。

类: Buffer
Buffer 类是全局变量类型,用来直接处理2进制数据。 它能够使用多种方式构建

Buffer.from(array) 返回一个新的 Buffer,其中包含提供的八位字节数组的副本。
Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一个新的 Buffer,它与给定的 ArrayBuffer 共享相同的已分配内存。
Buffer.from(buffer) 返回一个新的 Buffer,其中包含给定 Buffer 的内容的副本。
Buffer.from(string[, encoding]) 返回一个新的 Buffer,其中包含提供的字符串的副本。
Buffer.alloc(size[, fill[, encoding]]) 返回一个指定大小的新建的的已初始化的 Buffer。 此方法比 Buffer.allocUnsafe(size) 慢,但能确保新创建的 Buffer 实例永远不会包含可能敏感的旧数据。
Buffer.allocUnsafe(size) 和 Buffer.allocUnsafeSlow(size) 分别返回一个指定大小的新建的未初始化的 Buffer。 由于 Buffer 是未初始化的,因此分配的内存片段可能包含敏感的旧数据。

1.ascii——ASCI,仅适用于ASCII字符集。
2.utf8——UTF-8,这种可变宽编码适用于Unicode字符集的任何字符,它已经成了Web世界的首选编码,也是Node的默认编码类型。
3.base64——Base64,这种编码基于64个可打印ASCII字符来表示二进制数据,Base64通常用于在字符文档内嵌入可以被转化成字符串的二进制数据,在需要时又可以完整无损的转换回原来的二进制格式。

Buffer简单理解及常用方法介绍

javascript 中对数据处理都是以字符串的形式,而对于二进制数据就不便于处理,所以 Buffer 便是用于读取或操作二进制数据的对象。

通俗来说Buffer其实就是处理数据的方法,这点在官网文档里解释的很详细。
Buffer 是内存拷贝,而不是内存共享。

Buffer 占用内存被解释为一个数组,而不是字节数组。比如,new Uint32Array(new Buffer([1,2,3,4])) 创建了4个 Uint32Array,它的成员为 [1,2,3,4] ,而不是[0x1020304] 或 [0x4030201]。
注意:Node.js v0.8 只是简单的引用了array.buffer里的 buffer ,而不是克隆(cloning)。

介绍一个高效的方法,ArrayBuffer#slice() 拷贝了一份切片,而 Buffer#slice() 新建了一份。

类: Buffer
Buffer 类是全局变量类型,用来直接处理2进制数据。 它能够使用多种方式构建

Buffer.from(array) 返回一个新的 Buffer,其中包含提供的八位字节数组的副本。
Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一个新的 Buffer,它与给定的 ArrayBuffer 共享相同的已分配内存。
Buffer.from(buffer) 返回一个新的 Buffer,其中包含给定 Buffer 的内容的副本。
Buffer.from(string[, encoding]) 返回一个新的 Buffer,其中包含提供的字符串的副本。
Buffer.alloc(size[, fill[, encoding]]) 返回一个指定大小的新建的的已初始化的 Buffer。 此方法比 Buffer.allocUnsafe(size) 慢,但能确保新创建的 Buffer 实例永远不会包含可能敏感的旧数据。
Buffer.allocUnsafe(size) 和 Buffer.allocUnsafeSlow(size) 分别返回一个指定大小的新建的未初始化的 Buffer。 由于 Buffer 是未初始化的,因此分配的内存片段可能包含敏感的旧数据。

1.ascii——ASCI,仅适用于ASCII字符集。
2.utf8——UTF-8,这种可变宽编码适用于Unicode字符集的任何字符,它已经成了Web世界的首选编码,也是Node的默认编码类型。
3.base64——Base64,这种编码基于64个可打印ASCII字符来表示二进制数据,Base64通常用于在字符文档内嵌入可以被转化成字符串的二进制数据,在需要时又可以完整无损的转换回原来的二进制格式。

Node.js的Buffer写入

Buffer写入的语法如下:

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

即根据encoding的字符编码写入string到buf中的offset位置。length参数是写入的字节数。如果buf没有足够的空间保存整个字符串,就只会写入string的一部分。只部分解码的字符不会被写入。该方法返回实际写入的大小。参数含义如下:

    ●    String:写入的字符串。

    ●    Offset:开始写入的索引值,默认为0。

    ●    Length:写入的字节数,默认为buffer.length。

    ●    Encoding:使用的编码,默认为"utf8"。

Node.js的Buffer写入

Buffer写入的语法如下:

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

即根据encoding的字符编码写入string到buf中的offset位置。length参数是写入的字节数。如果buf没有足够的空间保存整个字符串,就只会写入string的一部分。只部分解码的字符不会被写入。该方法返回实际写入的大小。参数含义如下:

    ●    String:写入的字符串。

    ●    Offset:开始写入的索引值,默认为0。

    ●    Length:写入的字节数,默认为buffer.length。

    ●    Encoding:使用的编码,默认为"utf8"。

node.js bufferutil是干什么用的

在大多数介绍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 = [];

conn.on('data', function (buf) {

bufs.push(buf);

});

conn.on('end', function () {

// 接收数据结束后,拼接所有收到的Buffer对象

var buf = Buffer.concat(bufs);

});

还可以利用Buffer.toString()来做转换base64或十六进制字符的转换,比如:

console.log(new Buffer('hello, world!').toString('base64'));

// 转换成base64字符串:aGVsbG8sIHdvcmxkIQ==

console.log(new Buffer('aGVsbG8sIHdvcmxkIQ==', 'base64').toString());

// 还原base64字符串:hello, world!

console.log(new Buffer('hello, world!').toString('hex'));

// 转换成十六进制字符串:68656c6c6f2c20776f726c6421

console.log(new Buffer('68656c6c6f2c20776f726c6421', 'hex').toString());

// 还原十六进制字符串:hello, world!

一般情况下,单个Node.js进程是有最大内存的,以下是来自官方文档中的说明:

What is the memory limit on a node process?

Currently, by default v8 has a memory limit of 512MB on 32-bit systems, and 1.4GB on 64-bit systems. The limit can be raised by setting --max_old_space_size to a maximum of ~1024 (~1 GB) (32-bit) and ~4096 (~4GB) (64-bit), but it is recommended that you split your single process into several workers if you are hitting memory limits.

由于Buffer对象占用的内存空间是不计算在Node.js进程内存空间上的,因此,我们也常常会使用Buffer来存储需要占用大量内存的数据:

// 分配一个2G-1字节的数据

// 单次分配内存超过此值会抛出异常 RangeError: Invalid typed array length

var buf = new Buffer(1024 * 1024 * 1024 - 1);

以上便是Buffer的几种常见用法。然而,阅读Buffer的API文档时,我们会发现更多的是readXXX()和writeXXX()开头的API,具体如下:

buf.readUIntLE(offset, byteLength[, noAssert])

buf.readUIntBE(offset, byteLength[, noAssert])

buf.readIntLE(offset, byteLength[, noAssert])

buf.readIntBE(offset, byteLength[, noAssert])

buf.readUInt8(offset[, noAssert])

buf.readUInt16LE(offset[, noAssert])

buf.readUInt16BE(offset[, noAssert])

buf.readUInt32LE(offset[, noAssert])

buf.readUInt32BE(offset[, noAssert])

buf.readInt8(offset[, noAssert])

buf.readInt16LE(offset[, noAssert])

buf.readInt16BE(offset[, noAssert])

buf.readInt32LE(offset[, noAssert])

buf.readInt32BE(offset[, noAssert])

buf.readFloatLE(offset[, noAssert])

buf.readFloatBE(offset[, noAssert])

buf.readDoubleLE(offset[, noAssert])

buf.readDoubleBE(offset[, noAssert])

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

buf.writeUIntLE(value, offset, byteLength[, noAssert])

buf.writeUIntBE(value, offset, byteLength[, noAssert])

buf.writeIntLE(value, offset, byteLength[, noAssert])

buf.writeIntBE(value, offset, byteLength[, noAssert])

buf.writeUInt8(value, offset[, noAssert])

buf.writeUInt16LE(value, offset[, noAssert])

buf.writeUInt16BE(value, offset[, noAssert])

buf.writeUInt32LE(value, offset[, noAssert])

buf.writeUInt32BE(value, offset[, noAssert])

buf.writeInt8(value, offset[, noAssert])

buf.writeInt16LE(value, offset[, noAssert])

buf.writeInt16BE(value, offset[, noAssert])

buf.writeInt32LE(value, offset[, noAssert])

buf.writeInt32BE(value, offset[, noAssert])

buf.writeFloatLE(value, offset[, noAssert])

buf.writeFloatBE(value, offset[, noAssert])

buf.writeDoubleLE(value, offset[, noAssert])

buf.writeDoubleBE(value, offset[, noAssert])

这些API为在Node.js中操作数据提供了极大的便利。假设我们要将一个整形数值存储到文件中,比如当前时间戳为1447656645380,如果将其当作一个字符串存储时,需要占用11字节的空间,而将其转换为二进制存储时仅需6字节空间即可:

var buf = new Buffer(6);

buf.writeUIntBE(1447656645380, 0, 6);

// <Buffer 01 51 0f 0f 63 04>

buf.readUIntBE(0, 6);

// 1447656645380

在使用Node.js编写一些底层功能时,比如一个网络通信模块、某个数据库的客户端模块,或者需要从文件中操作大量结构化数据时,以上Buffer对象提供的API都是必不可少的。

node 的哪些常用方法可以传递路由参数?

在 Node.js 中,常用的传递路由参数的方法有以下几种:

1. 通过 URL 传递参数,例如:http://localhost:8080/#/d/123;

2. 通过 query 传参,例如:http://localhost:8080/?id=123;

3. 通过 params 传参,例如:http://localhost:8080/#/d/123?id=123;

4. 通过 route 传参,例如:D

六三科技网还为您提供以下相关内容希望对您有帮助:

Buffer简单理解及常用方法介绍

Buffer 占用内存被解释为一个数组,而不是字节数组。比如,new Uint32Array(new Buffer([1,2,3,4])) 创建了4个 Uint32Array,它的成员为 [1,2,3,4] ,而不是[0x1020304] 或 [0x4030201]。注意:Node.js v0....

Node.js的Buffer写入

Buffer写入的语法如下:buf.write(string[,offset[,length]][,encoding])即根据encoding的字符编码写入string到buf中的offset位置。length参数是写入的字节数。如果buf没有足够的空间保存整个字符串,就只会写入string的一部分。...

node.js bufferutil是干什么用的

console.log(new Buffer('68656c6c6f2c20776f726c6421', 'hex').toString());// 还原十六进制字符串:hello, world!一般情况下,单个Node.js进程是有最大内存限制的,以下是来自官方文档中的说明:What is the memory...

node什么时候使用buffer

谓缓冲区Buffer,就是 "临时存贮区" 的意思,是暂时存放输入输出数据的一段内存。 JS语言自身只有字符串数据类型,没有二进制数据类型,因此NodeJS提供了一个与String对等的全局构造函数Buffer来提供对二进制数据的操作。

网络请求出错什么意思

汉语中,“网络”一词最早用于电学《现代汉语词典》(1993年版)做出这样的解释:“在电的系统中,由若干元件组成的用来使电信号按一定要求传输的电路或这种电路的部分,叫网络。”在数学上,网络是一种图,一般认为专指加权...

利用Node.js如何实现文件循环覆写

最理想的控制方式就是当文件大小超过限制时,清除最先记录的数据。类似一个FIFO的队列。# 删除前面的数据- 1 xxx ... 100 abc# 文件末尾追加数据+ 101 xxxxlog4js的file rolling一提到记录日志很多Node.js开发者肯定会...

nodejs怎么post文件流

利用nodejs中的 http.ServerRequest中获取1):request.method 用来标识请求类型 request.headers 其中我们关心两个字段:content-type 包含了表单类型和边界字符串(下面会介绍)信息。content-length post数据的长度 关于content-...

使用Node中的Buffer模块,将图片转换成base64编码

Buffer官方文档如下 http://nodejs.cn/api/buffer.html node开发过程中,常用的就是将图片转换成base64编码,这时候就用到buffer了:运行 将打印出来的结果输入到test.js这个文件里,便于查看。之后我们在test.js里就能...

C语言中buffer到底是什么意思?是数组?缓冲区?为什么一般C程序中都不定...

Buffer是NodeJS的重要数据类型,很有广泛的应用。代表原始堆的分配额的数据类型。在NodeJS中以类数组的方式使用。在Buffer类的描述中,Buffer被定义为用于特定基本类型数据的容器,且是特定基本类型的线性优先元素序列。Buffer...

nodejs的Buffer有办法像c的结构体那样用吗

可以使用ref和ref-struct模块 比如想要定义下面这样的结构 struct timeval { time_t tv_sec; /* seconds since Jan. 1, 1970 */ suseconds_t tv_usec; /* and microseconds */ };如果在nodejs里面用ref和...

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

Top