node 之 Buffer 笔记
1. Buffer 相关
js 最初是被设计来处理 html的,因此它不善于处理二进制数据,只有数值和字符串类型。而 node 是基于 js 的,因为 node 需要实现一些譬如数据库通信、操作图像及文件上传等,只是用字符串来操作完成这些任务是相当困难的,且费资源,速度缓慢,还不安全。所以,node 就引入了一个二进制缓冲区 Buffer 来实现。
Buffer 类的另一个特别之处是数据占用的内存并不是分配在 js VM 内存堆中,这些对象不会被垃圾收集算法处理,它会占据一个不被修改的永久内存地址,这样就避免了因缓冲区内容的内存复制所造成的 cpu 浪费。
当创建一个已经被初始化的缓冲区时,缓冲区中包含的数据并非是 0,而是一些随机值。
var buf = new Buffer('1234asdf');
console.log(buf[i]) // i ∈ [0, 7] eg: buf[1] 可能为任意随机值
- 如果某个位置设置为一个大于 255 的数,那么将会用 256 对概述取模,最终取模结果赋给该位置;设置为小数,则会取整;给超出边界的位置赋值,会失败,缓冲区不会发生变化

- 可以从父缓冲区切分一块更小的缓冲区。子缓冲区延用父缓冲区的内存区域;父变子可能变;这种方式,父缓冲区在操作结束后依然继续保留,并不会并垃圾收集器回收,处理不慎很容易内存泄漏。可用 copy 方式来代替 slice 方式。
var buffer = new Buffer("My name is Mobro Zhu");
var childBuffer = buffer.slice(11);
console.log(childBuffer)
console.log(childBuffer.toString())
console.log(buffer.toString()) // 缓冲区解码
// copy 方式
var childBuffer2 = new Buffer(11);
buffer.copy(childBuffer2, 0, 11)
// === buffer.copy(childBuffer2, 0, 11, 19)
console.log(childBuffer2.toString()); // Mobro Zhu
2. Buffer API (参考地址: https://nodejs.org/dist/latest-v10.x/docs/api/buffer.html)
Class Method: Buffer.alloc(size[, fill[, encoding]])
声明一个 Buffer; size 是必须参数。这里的 fill 可以是数字,字符串,但好像不能是数组,对象;而且,"12" 和 12 的结果是不相同的;
与此类似的有:
Buffer.allocUnsafe(size) Buffer.alloc(size, fill) 永远不会使用这个内部的 Buffer 池,但如果 size 小于或等于 Buffer.poolSize 的一半, Buffer.allocUnsafe(size).fill(fill) 会使用这个内部的 Buffer 池.
Buffer.allocUnsafeSlow(size) 这个方法通过像大多数持久对象一样消除追踪与清理的需求,改善了性能与内存使用。
const buf = Buffer.alloc(10, "abc", "utf-8");
console.log(buf.toString()) // abc
//////
buf = Buffer.alloc(2)
buf.fill("12", "base64") // buf.fill(fill, encoding)
console.log(buf.toString("base64")) // 为什么不是 12,而是 19c=
// base64 的声明方式
const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
console.log(buf);
常见的 API:
Buffer.byteLength(string[, encoding]) 字符串的实际字节长度。
Buffer.from()
Buffer.compare(buf1, buf2) 类似 Array.compare()
Buffer.concat(list[, totalLength])
Buffer.from(array)
Buffer.from(arrayBuffer[, byteOffset[, length]])
Buffer.from(buffer)
Buffer.from(string[, encoding])
Buffer.from(object[, offsetOrEncoding[, length]])
Buffer.isBuffer(obj)
Buffer.isEncoding(encoding)
Buffer.poolSize 缓冲池
Buffer.concat([buf1, buf2, buf3], totalLength)
常见的实例 API:
buf.buffer 指向创建该 Buffer 的底层的 ArrayBuffer 对象
// buf.buffer
const arrayBuffer = new ArrayBuffer(16);
const buffer = Buffer.from(arrayBuffer);
console.log(buffer.buffer === arrayBuffer);
沾沾人气听听热闹,人才不会固步自封,被憋死在孤独的绝壁里。
人间烟火是好东西,琐碎而温暖。
一一 俗念亲 《每次跳楼,都看见那厮在铺救生气垫》
node 之 Buffer 笔记的更多相关文章
- Node.js学习笔记(2):基本模块
Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...
- node的buffer模块
Buffer这块很早前就想留一篇笔记.前端JS处理buffer的场景其实并不多,虽然后来基于webGL与显卡通信的需求增加了二进制数组,但毕竟相对小众. Buffer的含义是,在数据传输时用内存中的一 ...
- node.js系列笔记之node.js初识《一》
node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...
- Node.js Buffer(缓冲区)
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...
- 一点感悟:《Node.js学习笔记》star数突破1000+
写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...
- Node.js学习笔记(3):NPM简明教程
Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...
- 系列文章--Node.js学习笔记系列
Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...
- Node.js学习笔记(1):Node.js快速开始
Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...
- Node.js自学笔记之回调函数
写在前面:如果你是一个前端程序员,你不懂得像PHP.Python或Ruby等动态编程语言,然后你想创建自己的服务,那么Node.js是一个非常好的选择.这段时间对node.js进行了简单的学习,在这里 ...
随机推荐
- MIPI-Layout说明(转载)
转载于:http://www.ccm99.com/thread-3713-1-1.html 前言:随着新的总线协议不断提高信号速率,如今的PCB 设计人员需要充分理解高速布线的要求并控制PCB 走线的 ...
- extjs 跨域 ajax.request
https://www.cnblogs.com/yuzhongwusan/p/3677955.html https://stackoverflow.com/questions/25727306/req ...
- nginx隐藏tp路由index.php
---------------------------------------------- 也可以找到vhosts.conf文件修改, 重启nginx,service nginx restart
- jenkins centos slave起不来报错The SSH key presented by the remote host does not match the key saved in the Known Hosts file against this host. Connections to this host will be denied until the two keys mat
场景:我的centos-204是一台centos的机器,本来用https://www.cnblogs.com/zndxall/p/8297356.html 的centos slave方式搭建ok的,一 ...
- Linux学习路线全解,Linux操作系统学习路线
大家都知道,在现在这个信息化飞速发展的时代,IT技术火速发展,信息的重要性,可想而知.现在,在北京当一个高级运维工程师,年薪百万已经不是梦想.当然我也想,谁不想挣大钱,开好车,住好房.下面说说自己的一 ...
- eclipse 编码改成utf-8
Eclipse的编码格式是系统默认 修改为utf-8,点击Apply and Close 然后项目的编码格式会统一默认utf-8 当然也可以选择other,改成GBK.
- java操作JacocClient下载dump文件
记录瞬间 import org.jacoco.core.data.ExecutionDataWriter; import org.jacoco.core.runtime.RemoteControlRe ...
- 从json-lib转成jackson的遇到的问题
从json-lib转成jackson的遇到的问题 问题一:json 字符串,再经过Jackson序列化之后就变成原生字符串了.而json-lib经过再序列化之后,还是json格式的串. 针对这种情况, ...
- Oracle 体系结构chapter2
前言:Oracle 体系结构其实就是指oracle 服务器的体系结构,数据库服务器主要由三个部分组成 管理数据库的各种软件工具(sqlplus,OEM等),实例(一组oracle 后台进程以及服务器中 ...
- jdk5升级至jdk8框架版本选型
spring-framework-4.3.18.RELEASE 4.3.x+:JDK8 Spring JDK Version Range Spring Framework 5.1.x: JDK 8- ...