Node.js(十四)——Net模块之Buffer

网络的基础是数据的传输和处理,Buffer缓冲,在NodeJs中处理二进制的数据,为何要折腾出一个Buffer呢,由于JavaScript字符串是一个utf-8编码存储的,处理二进制的能力是很弱的,而网络层对于不一样资源的请求、响应甚至是文件都是用二进制进行交互的,因此NodeJs就有了这么一个接口,专门存放二进制的缓存区,并提供了一些方法来对这些缓存区的数据进行进一步的处理,html

Buffer在NodeJs中是能够全局访问的,一样用require来引用和加载它;node


在Buffer对象与字符串直接相互转化的时候是须要指定编码格式的,若是不指定;默认是按照utf-8的格式进行转换的api

新版:数组

wKioL1jbnyGzzvnNAABH3ZPyOL8551.jpg

以前版本的写法是:缓存

wKioL1jbn1PzQ3PwAAAu74y-a3A858.jpg

第二种:传递一个size参数 来表示缓存区的大小网络

wKiom1jbn7TjnadXAAARSjnQa0U895.jpg

这种实例化的方法只是分配了一段内存区间,往里面写入的内容若是超出长度,那么超出长度的部分是不会被缓冲的jsp

例如:ide

wKiom1jboH7hW8k2AABDcQFEv8s370.jpg

第三种初始化方法:经过数组函数

固然也能够经过下标来取得数组中的值,若是数组的值为小数型,这个时候取下标的时候会作取整操做。ui

wKioL1jboUfwLFY8AABRtYO2nb8535.jpg


做为一种存储原始数据的方法,Buffer不只能处理jsp链接中发送和接收的数据,

也能处理图像或者是压缩文件,读取到二进制数据甚至是文件系统中的读写的数据,

包括网络中的二进制数据流,只是是NodeJs中能处理的IO操做中移动的数据都能用到Buffer

Buffer应该怎么用?

Buffer是一个构造函数,同时也是一个对象 它里面的属性有:

poolSize:内存载体的容量

静态方法

isBuffer:判断对象是不是buffer类型的对象

compare:用来判断两个buffer对象的相对位置,通常用来作字符串的排序

isEncoding:判断NodeJs是否支持某种编码,像中文处理只能使用utf-8这种编码,对于gbk是没法解析的,须要使用第三方库

concat:用于将几个buffer对象链接建立为一个新的buffer对象,咱们能够手工分配合并的buffer对象的空间大小,若是空间不够数据会被截断

bytelength:用来得到指定编码下字符串所占的字节数,因为字符串编码的不一样字符串长度和字节长度也是不同的


实例化以后所具备的能力:

buf.write()

buf.toString()

buf.copy()

更多参考API文档

buffer | Node.js API 文档  http://nodejs.cn/api/buffer.html


编码所使用的场景?

本地须要读取一个图片,而后再复制一张图片出来,同时再拿到这个图片的

base64编码

已百度图标为例:

/**
 * New node file
 */
 //先拿到fs模块
var fs = require('fs')
//读出logo数据,同时建立到一个Buffer对象中
fs.readFile('logo.png', function(err,origin_buffer){
	//若是读取的过程当中指定了编码的话,就不是buffer对象了,而是你指定编码的那个字符串
	//首先判断是否是buffer
	console.log(Buffer.isBuffer(origin_buffer))
	//写一个新文件
	fs.writeFile('logo_buffer.png', origin_buffer,function(err){
		if(err) console.log(err);
	})
	
	//writeFile若是没有指定编码的话,会认为是一个utf8编码的字符串
	//基于原始的buffer再建立一个新的buffer对象,经过base64来解码
	//这样走了弯路
	//var base64Image = new Buffer(origin_buffer).toString('base64');
	var base64Image = origin_buffer.toString('base64')
	//打印base64的值
	console.log(base64Image);
	//把base64Image穿入参数
	var decodedImage = new Buffer(base64Image, 'base64');
	//判断两个buffer是否是同样的
	console.log(Buffer.compare(origin_buffer,decodedImage));
	fs.writeFile('logo_decoded.png',decodedImage,function(err){
		if(err) console.log(err);
	})
	
})

运行结果如图所示:

wKiom1jbzO_gqzkZAAMlSCYuzRU286.jpg

true说明咱们经过readFile拿到的的确是个buffer对象,

0:说明两个origin_buffer和decodedImage都是同样的。


那这个base64编码咱们应该怎么应用呢?

首先先把base64转码,经过

data::p_w_picpath/png;base64,

后面跟上base64编码字符串

  1. 先把src的路径给清空

  2. 再把从新编码后的字符串粘贴过去

就能够正常显示图片了,如图所示:

wKioL1jbzfHAaR06AADQR9EIcYk474.jpg