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模块的更多相关文章

  1. Node.js Buffer(缓冲区)

    JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...

  2. Node.js处理I/O数据之Buffer模块缓冲数据

    一.前传 在之前做web时也经常用到js对象转json和json转js对象.既然是Node.js处理I/O数据,也把这个记下来. Json转Js对象:JSON.parse(jsonstr); //可以 ...

  3. [Nodejs] node的fs模块

    fs 模块 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作 API. Node 导入文件系统模块(fs).Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如 ...

  4. Node入门教程(12)第十章:Node的HTTP模块

    Ryan Dahl开发node的初衷就是:把Nginx非阻塞IO功能和一个高度封装的WEB服务器结合在一起的东东.所以Node初衷就是为了高性能的Web服务器去的,所以:Node的HTTP模块也是核心 ...

  5. Node学习HTTP模块(HTTP 服务器与客户端)

    Node学习HTTP模块(HTTP 服务器与客户端) Node.js 标准库提供了 http 模块,其中封装了一个高效的 HTTP 服务器和一个简易的HTTP 客户端.http.Server 是一个基 ...

  6. Node解析之----模块机制篇

    开篇前,我们先来看张图, 看node与W3C组织.CommonJS组织.ECMAScript之间的关系. Node借鉴来CommonJS的Modules规范实现了一套非常易用的模块系统,NPM对Pac ...

  7. node之path模块

    node之path模块 原文链接 //引用该模块 var path = require("path"); 1.路径解析,得到规范化的路径格式 对window系统,目录分隔为'', ...

  8. 运用node的文件系统模块批量修改文件名

      如果我们需要大批量修改一个文件中的名称,比如,删除文件名中的副本时,就可以借助node的文件系统模块,快捷快速的完成. 首先建立一个js文件(changeName.js),代码如下: // 引入f ...

  9. Node.js的模块载入方式与机制

    Node.js中模块可以通过文件路径或名字获取模块的引用.模块的引用会映射到一个js文件路径,除非它是一个Node内置模块.Node的内置模块公开了一些常用的API给开发者,并且它们在Node进程开始 ...

随机推荐

  1. 来自BAT大厂前端工程师的自白-怎么才能学好前端

    如果说理解学好web前端是先能找到一份工作,那么你应该这样做: 1.制定好一下系统的web前端学习规划,每天定量,学完什么知识点就掌握,能自己应用,而不是能看懂,写不出来东西. 2.不要自己一个人闷头 ...

  2. 小程序里json字符串转json对象需注意的地方

    一.JSON字符串转换为JSON对象 要使用上面的str1,必须使用下面的方法先转化为JSON对象: //由JSON字符串转换为JSON对象 var obj = eval('(' + str + ') ...

  3. 解决Oracle在命令行下无法使用del等键问题

    前言: Oracle使用Linux命令行进行编辑? 有PL/SQL development,SQL development等工具,为何用Linux命令行? 但也免不了有用的的时候 以下是解决在Linu ...

  4. Linux 如何通过 iscsi target name 获取 ip

    by Mike Andrews # lsscsi -t [:::] disk iqn.-.com.blockbridge:t-pjxfzufjkp-illoghjk,t,0x1 /dev/sda [: ...

  5. JDK 14的新特性:更加好用的NullPointerExceptions

    JDK 14的新特性:更加好用的NullPointerExceptions 让99%的java程序员都头痛的异常就是NullPointerExceptions了.NullPointerExceptio ...

  6. hdu_1052 Tian Ji -- The Horse Racing 贪心

    Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  7. JAVA 之 JSTL

    一.什么是JSTL JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...

  8. Redis介绍及字符串操作

    一.前言 不同程序之间实现通信的方法? A.通过不同程序之间建立socket,实现通信.实际应用适用于使用broker,如RabbitMQ,ZeroMQ. B.通过Json,Pickle,利用文件的写 ...

  9. 数学--数论--欧拉降幂--P5091 欧拉定理

    题目背景 出题人也想写有趣的题面,可惜并没有能力. 题目描述 给你三个正整数,a,m,ba,m,ba,m,b,你需要求:ab mod ma^b \bmod mabmodm 输入格式 一行三个整数,a, ...

  10. 图论--最小环--Floyd模板

    #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> ...