node buffer,javascript buffer
什么是缓冲?下面这篇文章带你浏览Nodejs中的buffer模块,介绍创建、复制、拼接、截取、填充Buffer的方法,以及Buffer和String的相互转换。希望对你有帮助!
node.js速度课程简介:进入学习
1.buffer是什么?
我们知道,JS有相应的方法API来处理字符串、数组、数字、布尔值等。在节点中,它还需要文件操作、网络通信、数据库操作、数据传输等能力。文件在存储层以二进制形式表示,http请求和响应中的数据传输也是二进制数据传输,所以仅靠目前的JS能力是不够的,所以在Node中提供了buffer模块。
也就是说,NodeJS具有像字符串一样操作和处理二进制数据的能力。Buffer也叫temporary临时存储区,即暂时存储输入输出二进制数据的一段内存。
在之前的一篇文章中,我们谈到了Nodejs的核心模块:stream流模块(见如何使用)。我们了解到,在读取一个大文件时,通常不会一次性全部读入内存,而是以流的形式读取一个数据块,连续的数据块就形成了数据流的概念。在读写数据块的过程中,数据会先存储在内存的buffer(临时暂存区)中进行处理。
1.1 了解buffer内存分配
buffer对象的内存分配不在V8的堆内存中,而是在节点的C层实现内存的应用。为了有效地使用请求的内存,节点采用了slab分配机制(一种动态内存管理机制)。
1. 2 buffer的全局性
当节点进程启动时,缓冲区已经安装到内存中,并放入全局对象中。无需引入即可使用,但官方建议通过import或require语句显式引用。
2. 创建Buffer
缓冲区实例除了从文件中读取和通过http请求获取之外,还可以手动构造和创建。
2.1 Buffer.alloc(size[, fill[, encoding]])
参数:
Size: buffer length fill:预填充值,默认值:0encoding:如果fill是字符串,则为该字符串的编码,默认值:utf-8 import { Buffer } from Buffer ;
const buf=buffer . alloc(8);
console . log(buf);
//缓冲区00 00 00 00 00 00 00 00 002.2 Buffer.allocUnsafe(size)
参数:
Size:新缓冲区所需的长度。以这种方式创建的缓冲区实例的基础内存不会被初始化。新创建的缓冲区的内容未知,可能包含敏感数据。从“缓冲区”导入{ Buffer };
const buf=buffer . allocunsafe(8);
console . log(buf);
//Buffer E8 BF 99 E6 98 af E4 b 8 80 E62.3 Buffer.from(string[, encoding])
创建一个包含传入字符串的新缓冲区。
参数:
String: string encoding: encoding,默认值:utf-8 import { Buffer } from‘Buffer’;
const buf=buffer . from( hello buffer );
console . log(buf);
//Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 722.4 Buffer.from(array)
使用0255范围内的字节数组来分配新的缓冲区。
从“缓冲区”导入{ Buffer };
常量数组=[0x62,0x78,0x 84];
const buf=buffer . from(array);
console . log(buf);
//Buffer 62 78 84
3. 复制Buffer
3.1 Buffer.from(buffer)
参数:
buffer,要复制的缓冲区实例从“Buffer”导入{ Buffer };
//新建
const buf1=Buffer.alloc(10,2);
//复制
const buf 2=buffer . from(buf 1);
console . log(buf 1);
//Buffer 02 02 02 02 02 02 02 02 02 02 02 02
console . log(buf 2);
//Buffer 02 02 02 02 02 02 02 02 02 02 023.2 buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
将buf实例复制到目标target
从“缓冲区”导入{ Buffer };
const buf1=Buffer.alloc(10,2);
const buf 2=buffer . allocunsafe(10)
//将缓冲器1复制到缓冲器2
buf 1 . copy(buf 2);
console . log(buf 1);
//Buffer 02 02 02 02 02 02 02 02 02 02 02 02
console . log(buf 2);
//Buffer 02 02 02 02 02 02 02 02 02 02
4. 拼接Buffer
4.1 Buffer.concat(list[, totalLength])
返回一个新的缓冲区,列表中的所有缓冲区实例都连接在一起。
参数:
list:buffer[] unit 8 array[]total length:连接的总长度。注意:
如果列表没有条目,或者totalLength为0,则返回一个新的零长度缓冲区。如果未提供totalLength,则通过将列表中的缓冲区实例的长度相加来计算total length。从“缓冲区”导入{ Buffer };
const buf1=Buffer.alloc(4,2);
const buf2=Buffer.alloc(4,3);
const buf3=Buffer.concat([buf1,buf 2]);
console . log(buf 1);//缓冲区02 02 02 02
console . log(buf 2);//缓冲区03 03 03 03
console . log(buf 3);//Buffer 02 02 02 02 03 03 03 03
5. 截取Buffer
5.1 buf.slice([start[, end]])
从buf实例返回一个新的缓冲区实例。返回的新缓冲区实例只是对源buf实例的引用,即修改新返回的实例会影响原来的缓冲区实例。
参数:
Start:起始位置,默认0end:结束位置,默认buf . length import { buffer } from buffer ;
const buf1=Buffer.alloc(10,2);
//截取
const buf2=buf1.slice(1,4);
//拦截一些修改
buf 2[0]=0x 63;
console . log(buf 1);
//Buffer 02 63 02 02 02 02 02 02 02 02 02 02 02
console . log(buf 2);
//Buffer 63 02 02
6. 填充Buffer
6.1 buf.fill(value[, offset[, end]][, encoding])
参数:
Value,padding value offset:填充buf之前要跳过的字节数,默认值0 end:buf(不包含)结束的位置,默认值buf.lengthencoding,如果value值是字符串,则是字符串编码,默认值utf-8 import { Buffer } from Buffer ;
const buf1=Buffer.allocUnsafe(8)。填充(2);
console . log(buf 1);
//Buffer 02 02 02 02 02 02 02 026.2 buf.write(string[, offset[, length]][, encoding])
根据编码中的字符编码将字符串写入buf的偏移量。
注意:length参数是要写入的字节数。如果buf没有足够的空间来保存整个字符串,那么只有字符串的一部分会被写入。
参数:
String:写入的字符串值offset:写入字符串前要跳过的字节数。默认值为0length:写入的最大字节数。默认值为buf . length-offset encoding:encoding。默认值为utf-8 import { Buffer } from“Buffer”;
//buf1长度为12
const buf1=Buffer.alloc(12,3);
//写入偏移量大于buf1.length,写入无效。
buf1.write(hello ,12);
console . log(buf 1);
//缓冲区03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
//部分写入
buf1.write(hello ,10);
//Buffer 03 03 03 03 03 03 03 03 03 03 68 65
7. Buffer工具方法
7.1 Buffer.isBuffer(obj)
检查传入的obj是否是缓冲区。
从“缓冲区”导入{ Buffer };
const buf1=Buffer.alloc(12,3);
console . log(buffer . is buffer(buf 1));
//真7.2 Buffer.isEncoding(encoding)
检查Buffer是否支持传入的编码名称。
从“缓冲区”导入{ Buffer };
console . log(buffer . isen coding( utf-8 ))
//true
8. Buffer与String的转换
缓冲到字符串
8.1 buf.toString([encoding[, start[, end]]])
参数:
Encoding:使用的字符串编码,默认utf-8start,起始位置,默认0end,结束位置,默认buf . length import { buffer } from buffer ;
const buf 1=buffer . allocunsafe(26)
for(设I=0;i 26i ) {
//97是‘a’的十进制ASCII值。
buf 1[I]=I 97;
}
console.log(buf1.toString())
//abcdefghijklmnopqrstuvwxyzstring到缓冲区
8.2 Buffer.from(string[, encoding])
参数:
String: string encoding: encoding,默认值:utf-8 import { Buffer } from‘Buffer’;
const buf=buffer . from( hello buffer );
console . log(buf);
//缓冲区68 65 6c 6c 6f 20 62 75 66 66 65 72
9. Buffer与Array的对比
9.1 与Array类似点
您可以使用下标获取指定位置的值,使用length属性获取缓冲区大小,并使用.穿越9.2 与Array不同之处。
以十六进制存储,两位值为0-255,支持多种编码格式。v8堆中没有分配内存。底层由C实现,上层由js控制。更多关于node的信息,请访问:nodejs教程!缓冲就是这样。了解Nodejs中缓冲模块的更多细节,更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。