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

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

Buffer在NodeJs中是可以全局访问的,同样用require来引用和加载它;

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

新版:

之前版本的写法是:

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

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

例如:

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

当然也可以通过下标来取得数组中的值,如果数组的值为小数型,这个时候取下标的时候会做取整操作。

作为一种存储原始数据的方法,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);
	})

})

运行结果如图所示:

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

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

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

首先先把base64转码,通过

data::image/png;base64,

后面跟上base64编码字符串

  1. 先把src的路径给清空
  2. 再把重新编码后的字符串粘贴过去

就可以正常显示图片了,如图所示:

时间: 2024-08-07 08:38:10

Node.js(十四)——Net模块之Buffer的相关文章

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

在Unix中流是一个标准的概念,有标准的输入.输出和标准的错误 例如: 打印出所有的js文件交给grep 来过滤出包含http文件的内容,称之为Unix的管道 cat *.js | grep http 从上节得知Buffer是保存字节的数据,而流是用来暂存和移动数据的,它俩通常是结合起来来使用,我们来拷贝文件,像读取logo,是全部的读取入到内存中,然后再写入到文件中,对于体积比较大的的文件就不够用了假设我们的服务器需要不断的去读取文件,然后返回给客户端,同时又有好多人都在请求这个文件,这样每个

玩转Node.js(四)-搭建简单的聊天室

玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一些个教程使用它来搭建一个超级简单的聊天室. 初始化项目 在电脑里新建一个文件夹,叫做“chatroom”,然后使用npm进行初始化: $ npm init 然后根据提示以及相关信息一步一步输入,当然也可以一路回车下去,之后会在项目里生成一个package.json文件,里面的信息如下: 1 $ ca

node.js(七) 子进程 child_process模块

众所周知node.js是基于单线程模型架构,这样的设计可以带来高效的CPU利用率,但是无法却利用多个核心的CPU,为了解决这个问题,node.js提供了child_process模块,通过多进程来实现对多核CPU的利用. child_process模块提供了四个创建子进程的函数,分别是spawn,exec,execFile和fork. 1.spawn函数的简单用法 spawn函数用给定的命令发布一个子进程,只能运行指定的程序,参数需要在列表中给出.如下示例: var child_process

Node.js笔记(0001)---connect模块

首先来看这一部分代码 1 /** 2 * Created by bsn on 14-7-1. 3 */ 4 var connect = require('connect'); 5 6 var app = connect(); 7 function hello(req, res, next) { 8 console.log(req.url); 9 res.end('hello bsn'); 10 next(); 11 } 12 13 function helloAgain(req, res) {

node.js第二天之模块

一.模块的定义 1.在Node.js中,以模块为单位划分所有功能,并且提供了一个完整的模块加载机制,这时的我们可以将应用程序划分为各个不同的部分. 2.狭义的说,每一个JavaScript文件都是一个模块:而多个JavaScript文件之间可以相互require,他们共同实现了一个功能,他们整体对外,又称为一个广义上的模块. 3.Node.js中,一个JavaScript文件中定义的变量.函数,都只在这个文件内部有效.当需要从此JS文件外部引用这些变量.函数时,必须使用exports对象进行暴露

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

一.前传 在之前做web时也经常用到js对象转json和json转js对象.既然是Node.js处理I/O数据,也把这个记下来. Json转Js对象:JSON.parse(jsonstr); //可以将json字符串转换成json对象 Js对象转Json:JSON.stringify(jsonobj); //可以将json对象转换成json对符串 var jsonStr='{"name":"cuiyanwei","sex":"男&quo

使用Node.js的socket.io模块开发实时web程序

首发:个人博客,更新&纠错&回复 今天的思维漫游如下:从.net的windows程序开发,摸到nodejs的桌面程序开发,又熟悉了一下nodejs,对“异步”的理解有了上上周对操作系统的学习而更能理解.然后发现了Node.js中的socket.io这个模块,又觉得跟前几天用.net做客户端的socket游戏了.技术世界,兜兜转转,相逢一笑,疑是故人. socket.io用来做实时web程序,解决之前的B/S程序只有无状态连接,特定需求还需要用长连接这种“奇技淫巧”的问题.当然,这是html

node.js中使用net模块创建服务器和客户端

1.node.js中net模块创建服务器(net.createServer) // 将net模块 引入进来 var net = require("net"); // 创建一个net.Server用来监听,当连接进来的时候,就会调用我们的函数 // client_sock,就是我们的与客户端通讯建立连接配对的socket // client_sock 就是与客户端通讯的net.Socket var server = net.createServer(function(client_soc

Node.js权威指南 (4) - 模块与npm包管理工具

4.1 核心模块与文件模块 / 574.2 从模块外部访问模块内的成员 / 58 4.2.1 使用exports对象 / 58 4.2.2 将模块定义为类 / 58 4.2.3 为模块类定义类变量或类函数 / 614.3 组织与管理模块 / 61 4.3.1 从node_modules目录中加载模块 / 61 4.3.2 使用目录来管理模块 / 62 4.3.3 从全局目录中加载模块 / 624.4 模块对象的属性 / 634.5 包与npm包管理工具 / 65 4.5.1 Node.js中的包