node.js官方文档解析 02—buffer 缓冲器
Buffer
类的实例类似于整数数组,但 Buffer
的大小是固定的、且在 V8 堆外分配物理内存。Buffer
的大小在被创建时确定,且无法调整。
Buffer
类在 Node.js 中是一个全局变量,因此无需使用 require('buffer').Buffer
。
// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);
//const(常量)
//.alloc(分配/申请内存) // 创建一个长度为 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1); // 创建一个长度为 10、且未初始化的 Buffer。
// 这个方法比调用 Buffer.alloc() 更快,
// 但返回的 Buffer 实例可能包含旧数据,
// 因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10); // 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]); // 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。 ??????
const buf5 = Buffer.from('tést'); // 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
const buf6 = Buffer.from('tést', 'latin1');
//TypedArray:对象描述底层二进制数据缓冲区的类似数组的视图。没有一个名为TypedArray的全局属性,也没有直接可见的TypedArray构造器。相反,这里有许多不同的全局属性,它们的值是特定元素类型的类型化数组构造函数。
Buffer.from(array)
返回一个新建的包含所提供的字节数组的副本的Buffer
。- [
Buffer.from(arrayBuffer[, byteOffset [, length]])
][Buffer.from(arrayBuffer)
] 返回一个新建的与给定的ArrayBuffer
共享同一内存的Buffer
。 Buffer.from(buffer)
返回一个新建的包含所提供的Buffer
的内容的副本的Buffer
。Buffer.from(string[, encoding])
返回一个新建的包含所提供的字符串的副本的Buffer
。- [
Buffer.alloc(size[, fill[, encoding]])
]Buffer.alloc()
返回一个指定大小的被填满的Buffer
实例。 这个方法会明显地比Buffer.allocUnsafe(size)
慢,但可确保新创建的Buffer
实例绝不会包含旧的和潜在的敏感数据。 Buffer.allocUnsafe(size)
与Buffer.allocUnsafeSlow(size)
返回一个新建的指定size
的Buffer
,但它的内容必须被初始化,可以使用buf.fill(0)
或完全写满。
--zero-fill-buffers
命令行选项
Buffer
实例在创建时自动用 0 填充。 使用这个选项会改变这些方法的默认行为,且对性能有明显的影响。 建议只在需要强制新分配的 Buffer
实例不能包含潜在的敏感数据时才使用 --zero-fill-buffers
选项。
$ node --zero-fill-buffers
> Buffer.allocUnsafe(5);
<Buffer 00 00 00 00 00>
—— Buffer.allocUnsafe()
和 Buffer.allocUnsafeSlow()
不安全
当调用 Buffer.allocUnsafe()
和 Buffer.allocUnsafeSlow()
时,被分配的内存段是未初始化的(没有用 0 填充)。 虽然这样的设计使得内存的分配非常快,但已分配的内存段可能包含潜在的敏感旧数据。
使用通过 Buffer.allocUnsafe()
创建的没有被完全重写内存的 Buffer
,在 Buffer
内存可读的情况下,可能泄露它的旧数据。
虽然使用 Buffer.allocUnsafe()
有明显的性能优势,但必须额外小心,以避免给应用程序引入安全漏洞。
Buffer 与字符编码
Buffer
实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer
实例与普通的 JavaScript 字符串之间进行相互转换。
//UTF-8(统一资源定位符)
//UCS2(通用字符集)
//Base64(基于64编码)
//hex(十六进制编码)
for examle:
const buf = Buffer.from('hello world', 'ascii'); // 输出 68656c6c6f20776f726c64
console.log(buf.toString('hex')); // 输出 aGVsbG8gd29ybGQ=
console.log(buf.toString('base64'));
Node.js 目前支持的字符编码包括:
'ascii'
- 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。'utf8'
- 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。'utf16le'
- 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。'ucs2'
-'utf16le'
的别名。'base64'
- Base64 编码。当从字符串创建Buffer
时,按照 RFC4648 第 5 章的规定,这种编码也将正确地接受“URL 与文件名安全字母表”。'latin1'
- 一种把Buffer
编码成一字节编码的字符串的方式(由 IANA 定义在 RFC1345第 63 页,用作 Latin-1 补充块与 C0/C1 控制码)。'binary'
-'latin1'
的别名。'hex'
- 将每个字节编码为个十六进制字符。
注意:现代浏览器遵循 WHATWG 编码标准 将 'latin1' 和 ISO-8859-1 别名为 win-1252。 这意味着当进行例如 http.get()
这样的操作时,如果返回的字符编码是 WHATWG 规范列表中的,则有可能服务器真的返回 win-1252 编码的数据,此时使用 'latin1'
字符编码可能会错误地解码数据。
Buffer 与 TypedArray
Buffer
实例也是 Uint8Array
实例。 但是与 [ECMAScript 2015
] 中的 TypedArray 规范还是有些微妙的不同。 例如,当 ArrayBuffer#slice()
创建一个切片的副本时,Buffer#slice()
的实现是在现有的 Buffer
上不经过拷贝直接进行创建,这也使得 Buffer#slice()
更高效。
遵循以下注意事项,也可以从一个 Buffer
创建一个新的 TypedArray
实例:
Buffer
对象的内存是拷贝到TypedArray
的,而不是共享的。Buffer
对象的内存是被解析为一个明确元素的数组,而不是一个目标类型的字节数组。 也就是说,new Uint32Array(Buffer.from([1, 2, 3, 4]))
会创建一个包含[1, 2, 3, 4]
四个元素的Uint32Array
,而不是一个只包含一个元素[0x1020304]
或[0x4030201]
的Uint32Array
。
也可以通过 TypeArray 对象的 .buffer
属性创建一个新建的且与 TypedArray
实例共享同一分配内存的 Buffer
。
//Uint8Array (Uint8Array类型化数组代表一个8位无符号整数数组。内容被初始化为0。一旦建立,您就可以使用对象的方法来引用数组中的元素,或者使用标准的数组索引语法(也就是说,使用括号表示法)。)
类方法:Buffer.alloc(size[, fill[, encoding]])
size
<integer> 新建的Buffer
期望的长度fill
<string> | <Buffer> | <integer> 用来预填充新建的Buffer
的值。 默认:0
encoding
<string> 如果fill
是字符串,则该值是它的字符编码。 默认:'utf8'
分配一个大小为 size
字节的新建的 Buffer
。 如果 fill
为 undefined
,则该 Buffer
会用 0 填充。
const buf = Buffer.alloc(5); // 输出: <Buffer 00 00 00 00 00>
console.log(buf);
分配一个大小为 size
字节的新建的 Buffer
。 如果 size
大于 buffer.constants.MAX_LENGTH
或小于 0,则抛出 [RangeError
] 错误。 如果 size
为 0,则创建一个长度为 0 的 Buffer
。
如果 size
不是一个数值,则抛出 TypeError
错误。
node.js官方文档解析 02—buffer 缓冲器的更多相关文章
- node.js官方文档解析 01—assert 断言
assert-------断言 new assert.AssertionError(options) Error 的一个子类,表明断言的失败. options(选项)有下列对象 message < ...
- Node.js官方文档:到底什么是阻塞(Blocking)与非阻塞(Non-Blocking)?
译者按: Node.js文档阅读系列之一. 原文: Overview of Blocking vs Non-Blocking 译者: Fundebug 为了保证可读性,本文采用意译而非直译. 这篇博客 ...
- node.js官方文档chm电子书的制作
制作软件:WebCHMSetup2.22.zip,http://www.onlinedown.net/soft/31553.htm 制作好的电子书:Node.js(v6.10.2).zip 参考链接: ...
- Node.js 官方文档中文版
这目录也是醉了 . 列出跟没列出没两样
- bootbox.js官方文档中文版
bootbox.js官方文档中文版简介:Bootbox.js是一个小型的JavaScript库,基于Bootstrap模态框开发,用于创建可编程的对话框. 不像原生的alert等对话框,所有的Boot ...
- Hui之Hui.js 官方文档
基础 // 判断值是否是指定数据类型 var result = hui.isTargetType("百签软件", "string"); //=>true ...
- Android Google官方文档解析之——Application Fundamentals
Android apps are written in the java programming language.The Android SDK tools compile your code-al ...
- bootbox.js官方文档
简介 Bootbox.js是一个小型的JavaScript库,基于Bootstrap模态框开发,用于创建可编程的对话框. 不像原生的alert等对话框,所有的Bootstrap模态框生成的都是非阻塞事 ...
- sanic官方文档解析之Example(二)
1,通过docker部署sanic项目 通过Docker和Docker Compose部署SANIC应用程序是一项很容易实现的任务,下面的示例提供了示例simple_server.py的部署 FROM ...
随机推荐
- Go语言系列(八)- Goroute和Channel
一.Goroute 1. 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配合调度的一个独立单位 B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能 ...
- vue-cli项目生成
安装vue-cli C:\Users\fei>npm install -g vue-cli npm WARN deprecated coffee-script@1.12.7: CoffeeScr ...
- 【.net】ASP.Net设置和取消设置web项目起始页
#在visual studio中设置和取消web项目的起始页 方法一:在所要设置的页面上右键->设为起始页 方法二:web项目上右键->属性页 website项目: tips:如果取消要取 ...
- .net Core 下数据库访问
SqlSugar :是一款高性能(达到ADO.NET最高性能水平)SqlSugar :是除EF外拉姆达解析最完善的ORM,多表 .UnionALL. 交叉子查询.真实的批量操作和分页SqlSugar ...
- [物理学与PDEs]第2章习题9 粘性流体动能的衰减
设 $\Omega\subset {\bf R}^3$ 为有界域, ${\bf u}$ 为 Navier-Stokes 方程组 (3. 4)-(3. 5) 满足边界条件 (3. 7) 的解, 其中体积 ...
- SQLServer数据库文件由高版本向低版本转换
这个只能用2012的生成脚本功能,在高级里面把脚本兼容设置成2008,并且选择生成架构和数据(默认是只有架构)拿这个脚本在2008上跑一次就行了 sqlserver 中使用sqlcmd 执行*.sql ...
- Spring系列(五) 容器初始化过程源码
IoC/DI 的概念 容器是Spring的核心之一(另一个核心是AOP). 有了容器, IOC才可能实现. 什么使IoC? IoC就是将类自身管理的与其由依赖关系的对象的创建/关联和管理交予容器实现, ...
- monkey测试 -- 原理和操作步骤
Monkey测试原理: Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序 ...
- MySQL平滑删除数据的小技巧【转】
今天接到一位开发同学的数据操作需求,需求看似很简单,需要执行下面的SQL语句: delete from test_track_log where log_time < '2019-1-7 00: ...
- Fatal error: cannot initialize AIO sub-system
在一台服务器中以各数据库的备份文件为数据文件启动多个MySQL实例供SQL Review使用.之前运行一直没有问题(最多的时候有23个MySQL实例同时运行),后来新配置了一台服务器,启动其对应的实例 ...