使用node.js中的Buffer类处理二进制数据的方法

前言

在Node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区。这篇文章就详细介绍了node.js中的Buffer类处理二进制数据的方法,下面话不多说,来看看详细的介绍。

创建Buffer对象

第一种:直接使用一个数组来初始化缓存区

var arr = [0,1,2]
var buf = new Buffer(arr)
console.log(buf)

执行效果:

第二种:直接使用一个字符串来初始化缓存区

var str = 'hello'
var buf = new Buffer(str)
console.log(buf)

执行效果:

在Node.js中,将自动执行字符串的输入输出时的编码与解码处理,默认使用UTF8编码。

Buffer对象与字符串对象之间的相互转换

(1)toString

可以使用Buffer对象的toString方法将Buffer对象中保存的数据转换为字符串,使用方法如下:

buf.toString([encoding],[start],[end])

可选参数1:用于指定Buffer对象中保存的文字编码格式,默认参数为UTF8。

可选参数2:指定被转换数据的起始位置,以字节为单位。

可选参数3:指定被转换数据的终止位置,以字节为单位。

示例代码如下:

var buf = new Buffer('阁下何不随风起')
console.log(buf)
console.log(buf.toString('utf8',9,12))
console.log(buf.toString('utf8',12,buf.length))

效果如下:

控制台

(2)write

有时我们需要向已经创建的Buffer对象写入字符串,这时可以使用该Buffer对象的write方法。

buf.write(string,[offset],[length],[encodign])

必须参数1:指定需要写入的字符串

可选参数2-3:指定字符串转换为字节数据后的写入位置,字节数据的书写位置为从第1+offset个字节开始到offset+length个字节为止。

可选参数4:编码格式,默认utf8

代码如下:

var buf = new Buffer('阁下何不随风起')
buf.write('扶摇直上千万里',0,buf.length)
console.log(buf.toString())

运行效果如下:


控制台

(3)StringDecoder对象

在Node.js中,也可以使用StringDecoder对象将Buffer对象中的数据转换为字符串,该对象的作用与Buffer对象的toString方法的作用相同,但是对于utf8编码格式的字符串提供了更好的支持。

在使用StringDecoder对象时,首先需要加载Node.js中的string_decoder模块,方法如下:

var StringDecoder = require('string_decoder').StringDecoder

在加载了string_decoder模块后,可以创建一个StringDecoder对象,方法如下:

var decoder = new StringDecoder([encoding])

在需要将Buffer对象中的数据转换为字符串时,可以使用StringDecoder对象的write方法,write方法中可以使用一个参数,用于指定需要被转换的Buffer对象,该方法会返回转换后的字符串,代码如下:

decoder.write(buffer)

好,来对比一下Buffer对象的toString方法和StringDecoder的write方法究竟谁对utf8支持的更好。

Buffer的toString方法如下:

//在UTF-8编码格式下,将1个文字转换为多个字节
var buf = new Buffer('阁下何不随风起')
console.log(buf)

//0x是我手动加的
var str1 = new Buffer([0xe9, 0x98, 0x81, 0xe4, 0xb8, 0x8b, 0xe4, 0xbd])
console.log(str1.toString())

var str2 = new Buffer([0x95, 0xe4, 0xb8, 0x8d, 0xe9, 0x9a, 0x8f, 0xe9, 0xa3, 0x8e, 0xe8, 0xb5, 0xb7])
console.log(str2.toString())

运行效果如下:


控制台

当然,也可以用如下方法将两个buffer对象连接起来后再使用toString方法将其中的数据转换为字符串,但是当Buffer对象的长度较大时,这种操作的性能将会变得比较地下。

Buffer.concat([str1,str2]).toString()

StringDecoder的write方法如下:

//在UTF-8编码格式下,将1个文字转换为多个字节
var buf = new Buffer('阁下何不随风起')
console.log(buf)

//StringDecoder
var StringDecoder = require('string_decoder').StringDecoder
var decoder = new StringDecoder()

//0x是我手动加的
var str1 = new Buffer([0xe9, 0x98, 0x81, 0xe4, 0xb8, 0x8b, 0xe4, 0xbd])
console.log(decoder.write(str1))

var str2 = new Buffer([0x95, 0xe4, 0xb8, 0x8d, 0xe9, 0x9a, 0x8f, 0xe9, 0xa3, 0x8e, 0xe8, 0xb5, 0xb7])
console.log(decoder.write(str2))

运行效果如下:


控制台

谁支持的更好一眼就可以看出来了。

Buffer对象与JSON对象之间的相互转换

在Node.js中,可以使用JSON.stringify方法将Buffer对象中保存的数据转换为一个字符串,也可以使用JSON.parse方法将一个经过转换后的字符串还原为一个数组。

复制缓存数据

当需要将Buffer对象中保存的二进制数据复制到另一个Buffer对象中时,可以使用Buffer对象的copy方法,copy方法的使用方法如下:

buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd])

必须参数1:指定复制的目标Buffer对象

可选参数2:指定目标Buffer对象中从第几个字节开始写入数据

可选参数3:指定从复制源Buffer对象中获取数据时的开始位置,默认0

可选参数4:指定从复制源Buffer对象中获取数据时的结束位置,默认值为复制源对象的长度

示例代码如下:

//目标:将buf1 Buffer对象中的内容复制到buf2 Buffer对象中
//复制的目标起始位置为buf2 Buffer对象中的第11个字节处(第11个字节出开始写入)
var buf1 = new Buffer('阁下何不随风起')
console.log(buf1)
var buf2 = new Buffer(128)
buf2.fill(0)
console.log(buf2)

//关键代码
buf1.copy(buf2,10)

//输出复制后的buf2
console.log(buf2)

//以字符串的形式打印buf2
var StringDecoder = require('string_decoder').StringDecoder
var decoder = new StringDecoder()
console.log(decoder.write(buf2))

运行效果如下:


控制台

Buffer类的类方法

(1)isBuffer方法

用于判断一个对象是否为一个Buffer对象,使用方法如下:

Buffer.isBuffer(objc)

示例代码如下:

var a = 'abcde'
var b = new Buffer(10)

console.log(typeof a)
console.log(typeof b)
console.log('---我是奇妙的分隔符----')
console.log(Buffer.isBuffer(a))
console.log(Buffer.isBuffer(b))

运行结果:


控制台

(2)byteLength方法

可以使用ByteLength方法计算一个指定字符串的字节数,使用方法如下:

Buffer.byteLength(string,[encoding])

必须参数1:指定需要计算字节数的字符串

可选参数2:编码格式,默认utf8

示例代码如下:

var str = '阁下何不随风起'
console.log(str.length)
console.log(Buffer.byteLength(str,'utf8'))
console.log(Buffer.byteLength(str,'base64'))
console.log(Buffer.byteLength(str,'utf16le'))

运行结果如下:


控制台

(3)isEncoding方法

isEncoding方法用于检测一个字符串是否为一个有效的编码格式字符串。使用方法如下:

Buffer.isEncoding(encoding)

在isEncoding方法中,使用一个参数,用于指定需要被检测的字符串,如果该字符串为有效的编码格式字符串,则方法返回true,如果该字符串不是一个有效的编码格式字符串,则方法返回false。

示例代码如下:

var str1 = 'utf8'
console.log(Buffer.isEncoding(str1))
var str2 = 'utf16le'
console.log(Buffer.isEncoding(str2))
var str3= 'utf16e'
console.log(Buffer.isEncoding(str3))

运行效果如下:


控制台

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • Node.js中使用Buffer编码、解码二进制数据详解

    JavaScript很擅长处理字符串,但是因为它最初的设计是用来处理HTML文档,因此它并不太擅长处理二进制数据.JavaScript没有byte类型,没有结构化的类型(structured types),甚至没有字节数组,只有数字和字符串.(原文:JavaScript doesn't have a byte type - it just has numbers - or structured types, or http://skylitecellars.com/ even byte arra

  • 详解nodeJS之二进制buffer对象

    前面的话 在ES6引入TypedArray之前,JavaScript语言没有读取或操作二进制数据流的机制.Buffer类被引入作为Nodejs的API的一部分,使其可以在TCP流和文件系统操作等场景中处理二进制数据流.现在TypedArray已经被添加进ES6中,Buffer类以一种更优与更适合Node.js用例的方式实现了Uint8Array.本文将详细介绍buffer对象 概述 由于应用场景不同,在Node中,应用需要处理网络协议.操作数据库.处理图片.接收上传文件等,在网络流和文件的操作中

  • 使用node.js中的Buffer类处理二进制数据的方法

    前言 在Node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区.这篇文章就详细介绍了node.js中的Buffer类处理二进制数据的方法,下面话不多说,来看看详细的介绍. 创建Buffer对象 第一种:直接使用一个数组来初始化缓存区 var arr = [0,1,2] var buf = new Buffer(arr) console.log(buf) 执行效果: 第二种:直接使用一个字符串来初始化缓存区 var str = 'hello' var buf = n

  • Node.js中的Buffer对象及创建方式

    目录 什么是Buffer? 注意 Buffer中存储的都是二进制数据,但是在显示时以16进制显示 Buffer.length表示占用内存的大小 Buffer打印数字时会以十进制方式显示 Buffer的创建方法 通过Buffer的构造函数,但不推荐使用 通过allocUnsafe方法 通过alloc方法 通过Buffer.from()方法 写入缓冲区 从缓冲区读取数据 将 Buffer 转换为 JSON 对象 拷贝缓冲区 缓冲区与迭代器 总结 什么是Buffer? js语言自身只有字符串数据类型,

  • Node.js中防止错误导致的进程阻塞的方法

    在Node.js中,当某个回调函数发生了错误,整个进程都会崩溃,影响后面的代码执行. Node.js这样处理,是因为在发生未被捕获的错误时,进程的状态就不确定.之后也就无法正常工作了.如果错误始终不处理的话,就回一直抛出意料之外的错误,这样不利于调试. 防止错误导致的进程阻塞的方法主要有如下两种: 一. try-catch try-catch允许进行异常捕获,并让代码继续执行下去: 例如: 当函数抛出错误时,代码就停止执行了: (function() { var a = 0; a(); cons

  • node.js中优雅的使用Socket.IO模块的方法

    目录 前言 Socket.IO的定义 Socket.IO的优点 node中安装Socket.IO node中使用Socket.IO emit on 在express中引入使用 服务端 客户端 小结 前言 上篇文章中结合websokcet进行了简单的聊天小案例,但是我们可以发现使用ws模块来写代码的时候未免有一些繁琐,需要我们自己去设置type,使用socket.io后事件监听将会十分的简单便捷,很好的弥补了ws模块的缺陷. Socket.IO的定义 Socket.IO是一个WebSocket库,

  • Node.js下向MySQL数据库插入批量数据的方法

    项目(nodejs)中需要一次性插入多笔数据到数据库,数据库是mysql的,由于循环插入的性能太差,就像使用批量插入的方法提高数据的插入性能. 批量插入的数据库的表结构如下: 1.数据库连接 var mysql = require('mysql'); // 数据库信息 var connection = mysql.createConnection({ host : 'localhost', user : '数据库用户名', password : '数据库登录密码', database : '操作

  • Node.js中Bootstrap-table的两种分页的实现方法

    1.Bootstrap-table使用 github:https://github.com/wenzhixin/bootstrap-table 官方文档:http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/ bootstrap-table是一个基于bootstrap的表格插件,在使用上有点类似于easyui中的datagrid,但是样式上要比easyui美观一些,而且更加符合现代网站或者系统的前端要求. 不仅如此,bootstr

  • node.js中实现kindEditor图片上传功能的方法教程

    前言 最近由于工作需要使用在线编辑器,找了几个对比了下KindEditor还是不错的,国产的但文档还是不全,还好能参考官方插件,kindEditor官网上中提供了ASP,ASP.NET,JSP相关的整合应用 可以参照官方文档实现nodejs的kindEditor上传功能:http://kindeditor.net/docs/upload.html 在线下载kindEditor编辑器:http://www.jb51.net/codes/36131.html 实现方法: 1.在客户端js中定义upl

  • node.js中的buffer.copy方法使用说明

    方法说明: 进行不同buffer之间的复制替换操作. 从源buffer复制数据 并替换到目标buffer的指定位置. 语法: 复制代码 代码如下: buffer.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd]) 接收参数: targetBuffer        目标buffer,执行复制替换的buffer targetStart           目标buffer数据替换的起始位置 sourceStart       

  • node.js中的buffer.fill方法使用说明

    方法说明: 将制定数据填充到buffer中. 语法: 复制代码 代码如下: buffer.fill(value, [offset], [end]) 接收参数: value           将要填充的数据 offet           填充数据的开始位置,不指定默认为 0 end            填充数据的结束位置,不指定默认为 buffer 的 长度. 例子: 复制代码 代码如下: //例子1中,不指定填充内容的起止位置 var b = new Buffer(50); b.fill(

随机推荐