node的buffer模块
Buffer这块很早前就想留一篇笔记。前端JS处理buffer的场景其实并不多,虽然后来基于webGL与显卡通信的需求增加了二进制数组,但毕竟相对小众。
Buffer的含义是,在数据传输时用内存中的一块地方临时存储Input/Output的data(原始数据)。我们处理buffer,其实就是处理二进制数据。
在node中Buffer模块的Buffer类有好几十个api,主要的莫过于分配缓存区、读写、和一些常见操作。
*buffer在nodejs中是全局存在的,不必require。
*所有以new方式实例化buffer的操作在文档上都是不推荐甚至弃用的。
-------------------分割线-------------------------------------------------
1.实例化:
第一种方式是new Buffer(string),在REPL模式下:
> new Buffer('HELLO 你好');
<Buffer 48 45 4c 4c 4f 20 e4 bd a0 e5 a5 bd>
//默认是用utf-8转换,一个字母对应一个元素,空格是 20,一个汉字对应三个元素。
第二种是:var buf=new Buffer(10);此时开辟了一个区间,长度为10字节。buf.length 输出为10.
指定buffer长度后,写入的内容超出部分不会被缓存。
第三种方式是:var buf=new Buffer([1,2,3,4]);console.log(buf)
<Buffer 01 02 03 04> //当数组中的数值大小为256时,buffer中元素为 00 ,再增加时从01开始计算。
2.静态方法:
> Buffer
{ [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] }
3.实例方法:
buffer[index]
buffer.length
buffer.write(string,offset=0,length,encoding='utf8')
buffer.toString(encoding,start=0,end=buffer.length)
buffer.copy(target,tStart,sStart,sEnd=buffer.length)
buffer.slice(start,end)
buffer.compare(other buffer)
buffer.equals(other buffer)
buffer.fill(value,offset,end)
//offset表示字符串转换后写入的位置
*buffer在初始化的是后长度已经指定。
buffer.write方法写入时,默认从第0位开始覆盖。
var buf=new Buffer('hello mukewang');
buf.write('aaaaaaaaaa',6,8)
字符串‘mukewang’会被aaaaaaaa替代,超出长度部分被抛弃。
buffer.copy方法:
> var buf1=new Buffer('this is something');
undefined
> buf1.length
17
> var buf2=new Buffer(4);
undefined
> buf1.copy(buf2)
4
> buf2.toString();
'this'
> buf1.copy(buf2,0,5,17)
4
> buf2.toString();
>'is s'
当然,这些练习其实没什么意思。。。。。
在实际中比较有用的一种应用是格式转换:
>var words='hello';
>var buf=new Buffer(words);
>buf.toString('base64');
'aGVsbG8=' > var buf2=new Buffer('aGVsbG8=','base64');
> buf2.toString('utf8');
'hello'
另一个场景是图片的base64格式:
fs.readFile('./1.jpg',function(err,origin_buffer){
console.log(Buffer.isBuffer(origin_buffer))
fs.writeFile('decode.jpg',origin_buffer,function(err){
if(err){console.log(err)}
})
})
这段简单的代码先读取1.jpg这张图片,然后再创建一个decode.jpg并将二进制数据写入其中。结果是在本地生成一张图片。(上面就懒得转base64了)
如果本地保存有base64格式的图标/图片,将:
data:image/png;base64,base64格式的buffer
写入网页中某个元素的backgound-image:url(here)中,即可获取图片。
node的buffer模块的更多相关文章
- Node.js Buffer(缓冲区)
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...
- Node.js处理I/O数据之Buffer模块缓冲数据
一.前传 在之前做web时也经常用到js对象转json和json转js对象.既然是Node.js处理I/O数据,也把这个记下来. Json转Js对象:JSON.parse(jsonstr); //可以 ...
- [Nodejs] node的fs模块
fs 模块 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作 API. Node 导入文件系统模块(fs).Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如 ...
- Node入门教程(12)第十章:Node的HTTP模块
Ryan Dahl开发node的初衷就是:把Nginx非阻塞IO功能和一个高度封装的WEB服务器结合在一起的东东.所以Node初衷就是为了高性能的Web服务器去的,所以:Node的HTTP模块也是核心 ...
- Node学习HTTP模块(HTTP 服务器与客户端)
Node学习HTTP模块(HTTP 服务器与客户端) Node.js 标准库提供了 http 模块,其中封装了一个高效的 HTTP 服务器和一个简易的HTTP 客户端.http.Server 是一个基 ...
- Node解析之----模块机制篇
开篇前,我们先来看张图, 看node与W3C组织.CommonJS组织.ECMAScript之间的关系. Node借鉴来CommonJS的Modules规范实现了一套非常易用的模块系统,NPM对Pac ...
- node之path模块
node之path模块 原文链接 //引用该模块 var path = require("path"); 1.路径解析,得到规范化的路径格式 对window系统,目录分隔为'', ...
- 运用node的文件系统模块批量修改文件名
如果我们需要大批量修改一个文件中的名称,比如,删除文件名中的副本时,就可以借助node的文件系统模块,快捷快速的完成. 首先建立一个js文件(changeName.js),代码如下: // 引入f ...
- Node.js的模块载入方式与机制
Node.js中模块可以通过文件路径或名字获取模块的引用.模块的引用会映射到一个js文件路径,除非它是一个Node内置模块.Node的内置模块公开了一些常用的API给开发者,并且它们在Node进程开始 ...
随机推荐
- 敏捷与OKR实践(如何让OKR与敏捷计划共存)
僵化的详细长期计划(根据消耗的预算跟踪进度)正在敏捷组织中迅速成为对过去的褪色怀旧记忆,这由预测和非静态路线图代替.定期在这些可视化文件前聚会,您将能够学习.共享并触发重要的对话,解决依赖性并邀请服务 ...
- Selenium常见报错问题(1)- 先来认识下selenium常见异常类
如果你在跑selenium脚本时,需要某些异常不知道怎么解决时,可以看看这一系列的文章,看看有没有你需要的答案 https://www.cnblogs.com/poloyy/category/1749 ...
- 2019-2020-1 20199310《Linux内核原理与分析》第一周作业
1.问题描述 1.1 问题一 Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,探究根目录下主要文件用途. 1.2 问题二 有一个非常重要的文件(passw ...
- Kubernetes产生背景、核心概念
Kubernetes是什么 • Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S. • Kubernetes用于容器化应用程序的部署,扩展和管理 ...
- 增量学习不只有finetune,三星AI提出增量式少样本目标检测算法ONCE | CVPR 2020
论文提出增量式少样本目标检测算法ONCE,与主流的少样本目标检测算法不太一样,目前很多性能高的方法大都基于比对的方式进行有目标的检测,并且需要大量的数据进行模型训练再应用到新类中,要检测所有的类别则需 ...
- 多源最短路径算法:Floyd算法
前言 由于本人太菜,这里不讨论Floyd的正确性. 简介 多源最短路径,解决的是求从图中任意两点之间的最短路径的问题. 分析 代码短小精悍,主要代码只有四行,直接放上: for(int k=1;k&l ...
- Git上传本地仓库项目到gitee远程仓库(命令篇)
前言:最近整理了一下自己之前的自学代码,包括一些练习的项目.发现有些杂乱,故想使用Gitte(码云)管理.加上不少公司使用Git,所以写了这篇文章记录. 如果我们本地有了项目,那么如何上传到码云上呢? ...
- .NET Core技术研究-通过Roslyn代码分析技术规范提升代码质量
随着团队越来越多,越来越大,需求更迭越来越快,每天提交的代码变更由原先的2位数,暴涨到3位数,每天几百次代码Check In,补丁提交,大量的代码审查消耗了大量的资源投入. 如何确保提交代码的质量和提 ...
- 首次使用AWS服务器EC2
AWS有一年的免费套餐,这个便宜我得占. 申请的时候需要填写银行卡,AWS暂不支持储蓄卡,只好绑信用卡了. 创建EC2实例之后,下一个要解决的问题就是远程root访问. 1. 修改安全组设置 2. s ...
- python-文件字符分布【get()函数与.sort(key=lambda x:x[0],reverse = False)】
文件字符分布 描述 统计附件文件的小写字母a-z的字符分布,即出现a-z字符的数量,并输出结果. ...