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)中,即可获取图片。