使用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 相关文章推荐
jQuery 版本的文本输入框检查器Input Check
Jul 09 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
Apr 16 Javascript
JS操作CSS随机改变网页背景实现思路
Mar 10 Javascript
jQuery源码解读之removeAttr()方法分析
Feb 20 Javascript
JavaScript中Window对象的属性及事件
Dec 25 Javascript
jQuery购物网页经典制作案例
Aug 19 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
May 27 Javascript
对vue中v-on绑定自定事件的实例讲解
Sep 06 Javascript
微信小程序 WXML节点信息查询详解
Jul 29 Javascript
解决layui 三级联动下拉框更新时回显的问题
Sep 03 Javascript
ES6中Promise的使用方法实例总结
Feb 18 Javascript
react中hook介绍以及使用教程
Dec 11 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
PHP如何将XML转成数组
2016/04/04 PHP
Mac系统下安装PHP Xdebug
2018/03/30 PHP
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
2016/12/14 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
京东优选小程序的实现代码示例
2020/02/25 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
Python中的startswith和endswith函数使用实例
2014/08/25 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
python 如何调用远程接口
2020/09/11 Python
使用 HTML5 Canvas 制作水波纹效果点击图片就会触发
2014/09/15 HTML / CSS
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
生日寿宴答谢词
2014/01/19 职场文书
技校学生个人职业生涯规划范文
2014/03/03 职场文书
党员创先争优承诺书
2014/03/26 职场文书
中国梦团日活动总结
2014/07/07 职场文书
担保书格式
2015/01/20 职场文书
大学生实习介绍信
2015/05/05 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
失恋33天观后感
2015/06/11 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
Pygame如何使用精灵和碰撞检测
2021/11/17 Python
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android