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.静态方法:

 1 > Buffer
 2 { [Function: Buffer]
 3   poolSize: 8192,
 4   from: [Function],
 5   alloc: [Function],
 6   allocUnsafe: [Function],
 7   allocUnsafeSlow: [Function],
 8   isBuffer: [Function: isBuffer],
 9   compare: [Function: compare],
10   isEncoding: [Function],
11   concat: [Function],
12   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位开始覆盖。

1  var buf=new Buffer('hello mukewang');
2 buf.write('aaaaaaaaaa',6,8)

字符串‘mukewang’会被aaaaaaaa替代,超出长度部分被抛弃。

buffer.copy方法:

 1 > var buf1=new Buffer('this is something');
 2 undefined
 3 > buf1.length
 4 17
 5 > var buf2=new Buffer(4);
 6 undefined
 7 > buf1.copy(buf2)
 8 4
 9 > buf2.toString();
10 'this'
11 > buf1.copy(buf2,0,5,17)
12 4
13 > buf2.toString();
14 >'is s'

当然,这些练习其实没什么意思。。。。。

在实际中比较有用的一种应用是格式转换:

1 >var words='hello';
2 >var buf=new Buffer(words);
3 >buf.toString('base64');
4 'aGVsbG8='
5 
6 > var buf2=new Buffer('aGVsbG8=','base64');
7 > buf2.toString('utf8');
8 'hello'

另一个场景是图片的base64格式:

1 fs.readFile('./1.jpg',function(err,origin_buffer){
2     console.log(Buffer.isBuffer(origin_buffer))
3     fs.writeFile('decode.jpg',origin_buffer,function(err){
4         if(err){console.log(err)}
5     })
6 })

这段简单的代码先读取1.jpg这张图片,然后再创建一个decode.jpg并将二进制数据写入其中。结果是在本地生成一张图片。(上面就懒得转base64了)

如果本地保存有base64格式的图标/图片,将:

  data:image/png;base64,base64格式的buffer

写入网页中某个元素的backgound-image:url(here)中,即可获取图片。

原文地址:https://www.cnblogs.com/alan2kat/p/7428879.html