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


Posted in Javascript onNovember 26, 2016

前言

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

创建Buffer对象

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

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

执行效果:

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

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

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

执行效果:

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

在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))

效果如下:

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

控制台

(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())

运行效果如下:

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

(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())

运行效果如下:

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

当然,也可以用如下方法将两个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))

运行效果如下:

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

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

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))

运行效果如下:

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

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))

运行结果:

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

(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'))

运行结果如下:

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

(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))

运行效果如下:

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

总结

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

Javascript 相关文章推荐
JavaScript高级程序设计 错误处理与调试学习笔记
Sep 10 Javascript
弹出最简单的模式化遮罩层的js代码
Dec 04 Javascript
js 处理数组重复元素示例代码
Dec 27 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
Mar 25 Javascript
JavaScript获取某年某月的最后一天附截图
Jun 23 Javascript
JQuery鼠标移到小图显示大图效果的方法
Jun 10 Javascript
jQuery.extend 函数及用法详细
Sep 06 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
Dec 27 Javascript
Bootstrap警告框(Alert)插件使用方法
Mar 21 Javascript
关于Webpack dev server热加载失败的解决方法
Feb 22 Javascript
通过实例学习React中事件节流防抖
Jun 17 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
Mar 02 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
Nov 26 #Javascript
JS基于递归实现倒计时效果的方法
Nov 26 #Javascript
如何在Angular.JS中接收并下载PDF
Nov 26 #Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
Nov 25 #Javascript
AngularJs验证重复密码的方法(两种)
Nov 25 #Javascript
jQuery实现发送验证码并60秒倒计时功能
Nov 25 #Javascript
js document.getElementsByClassName的使用介绍与自定义函数
Nov 25 #Javascript
You might like
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
laravel 5.5 关闭token的3种实现方式
2019/10/24 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
node.js中的forEach()是同步还是异步呢
2015/01/29 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
[02:51]DOTA2 Supermajor小组分组对阵抽签仪式
2018/06/01 DOTA
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
Python实现包含min函数的栈
2016/04/29 Python
Numpy中的mask的使用
2018/07/21 Python
python编写简易聊天室实现局域网内聊天功能
2018/07/28 Python
python分布式编程实现过程解析
2019/11/08 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
美国著名的团购网站:Woot
2016/08/02 全球购物
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
神路信息Java面试题目
2013/03/31 面试题
考试作弊检讨书大全
2014/02/18 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
实习证明格式范文
2014/10/14 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
部队个人年终总结
2015/03/02 职场文书
百万英镑观后感
2015/06/09 职场文书
小学班级口号大全
2015/12/25 职场文书
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python