使用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 相关文章推荐
IE与FireFox的兼容性问题分析
Apr 22 Javascript
了解jQuery技巧来提高你的代码(个人觉得那个jquery的手册很不错)
Feb 10 Javascript
php 中序列化和json使用介绍
Jul 08 Javascript
javascript中match函数的用法小结
Feb 08 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
Jan 08 Javascript
node实现定时发送邮件的示例代码
Aug 26 Javascript
Vue2 模板template的四种写法总结
Feb 23 Javascript
JS实现百度网盘任意文件强制下载功能
Aug 31 Javascript
vue-router权限控制(简单方式)
Oct 29 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
Jan 09 Javascript
深入解析koa之中间件流程控制
Jun 17 Javascript
JS阻止事件冒泡的方法详解
Aug 26 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高级应用技巧果断收藏
2015/09/25 PHP
JavaScript中的prototype使用说明
2010/04/13 Javascript
javascript定义函数的方法
2010/12/06 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
[01:02:53]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第二局
2016/03/06 DOTA
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
python微信撤回监测代码
2019/04/29 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
计算机网络专业求职信
2014/06/05 职场文书
企业公益活动策划方案
2014/08/24 职场文书
网上祭先烈心得体会
2014/09/01 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
公司表扬信格式
2015/05/04 职场文书
2019各种保证书范文
2019/06/24 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python
springboot+VUE实现登录注册
2021/05/27 Vue.js
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server
「魔法少女伊莉雅」美游粘土人开订
2022/03/21 日漫
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers