node.js中Buffer缓冲器的原理与使用方法分析


Posted in Javascript onNovember 23, 2019

本文实例讲述了node.js中Buffer缓冲器的原理与使用方法。分享给大家供大家参考,具体如下:

一、什么是Buffer

Buffer缓冲器是用来存储输入和输出数据的一段内存。js语言没有二进制数据类型,在处理TCP和文件流的时候,就不是很方便了。

所以node.js提供了Buffer类来处理二进制数据,Buffer类是一个全局变量,Buffer在创建的时候大小就固定了,无法改变。

Buffer类的实例类似于由字节元素组成的数组,可以有效的表示二进制数据。

二、什么是字节

字节是计算机存储时的一种计量单位,一个字节等于8个位。一个位就代表0或1,每8个位(bit)组成一个字节(byte)。

字节是网络传输数据的基本单位,一个字节最大表示的十进制数是255。

三、什么是进制

进制是人为定义的带进位的计数方法,常见的有二进制,八进制,十六进制,和十进制。

将任意数字转换成不同进制

console.log(parseInt('12', 2));
console.log(parseInt('12', 8));
console.log(parseInt('12', 16));
console.log(parseInt('12', 10));

转换进制的另一种方法:

console.log((10).toString(2));
console.log((10).toString(8));
console.log((10).toString(16));
console.log((10).toString(10));

四、创建Buffer的方法

通过Buffer.alloc来创建指定长度Buffer

//创建6个字节的Buffer,用0填充数据
let buf1 = Buffer.alloc(6);
console.log(buf1);
//指定数字进行填充
let buf2 = Buffer.alloc(6, 2);
console.log(buf2);
//也可以指定字符进行填充,第三个参数表示字符编码,默认为utf8
let buf3 = Buffer.alloc(6, 'a', 'utf8');
console.log(buf3);

通过Buffer.allocUnsafe创建未初始化的Buffer,Buffer中的数据是未知的。

let buf = Buffer.allocUnsafe(6);
console.log(buf);

通过字节数组创建一个Buffer

let buf = Buffer.from([1, 2, 3, 4, 5]);
console.log(buf);

通过字符串创建一个Buffer,第二个参数表示字符编码,一个中文用3个字节表示。

let buf = Buffer.from('世界你好', 'utf8');
console.log(buf);

五、Buffer的一些常用方法

通过 fill() 以指定的数据填充Buffer

let buf = Buffer.alloc(12);
console.log(buf);
//参数一表示用来填充的值
//参数二表示开始的偏移量
//参数三表示结束的偏移量
//参数四表示字符编码
//偏移量的计算是左闭右开的区间,[start, end)
buf.fill(1, 0, 2);
console.log(buf);
buf.fill(2, 2, 4);
console.log(buf);
buf.fill('A', 4, 6);
console.log(buf);

通过 write() 向Buffer中写入数据

let buf = Buffer.alloc(12);
console.log(buf);
//参数一表示要写入的字符串
//参数二表示写入的偏移量
//参数三表示写入的字节数
//参数四表示字符编码
buf.write('世界', 0, 3);
console.log(buf);
console.log(buf.toString());
buf.write('世界', 3, 6);
console.log(buf);
console.log(buf.toString());

通过 writeInt8() 写入一个8位的整数,注意该整数是带符号的。

let buf = Buffer.alloc(12);
console.log(buf);
buf.writeInt8(1, 0);
buf.writeInt8(2, 1);
buf.writeInt8(3, 2);
//注意,8位的整数,如果带符号,区间在 -128 到 127 之间
buf.writeInt8(127, 3);
console.log(buf);

方法中还有一些writeInt16BE(),writeInt32BE(),writeInt16LE(),writeInt32LE()的方法。

因为不同的CPU架构,有不同的字节序,字节序是指数字在内存中保存的顺序。

以 BE 结尾的,表示 Big Endian ,将高位存储在起始位置。

以 LE 结尾的,表示 Little Endian,将低位存储在起始位置。

let buf = Buffer.alloc(6);
//将高位存储在起始位置
buf.writeInt16BE('256', 0); // [01 00 00 00 00 00]
console.log(buf);
//读取要与写入的方法一致,不然数据会错乱。
console.log(buf.readInt16BE(0));
let buf2 = Buffer.alloc(6);
//将低位存储在起始位置
buf2.writeInt16LE('256', 0); // [00 01 00 00 00 00]
console.log(buf2);
//读取要与写入的方法一致,不然数据会错乱。
console.log(buf.readInt16LE(0));

通过 toString() 方法,将Buffer解码成字符串。

let buf = Buffer.alloc(12);
buf.write('世', 0, 3);
buf.write('界', 3, 3);
buf.write('你', 6, 3);
buf.write('好', 9, 3);
console.log(buf);
console.log(buf.toString());

通过 slice() 创建一个新的Buffer切片,但是内存的指向与原Buffer仍然是同一块内存。

let buf = Buffer.alloc(12, 6);
console.log(buf);
//参数一表示开始切片偏移量
//参数二表示结束切片偏移量
let buf2 = buf.slice(0, 3);
buf2.fill(9);
console.log(buf);

通过 copy() 拷贝一个Buffer的数据到另一个Buffer

let t_buf = Buffer.alloc(12);
let s_buf = Buffer.alloc(6);
s_buf.write('世界', 0);
console.log(s_buf.toString());
//参数一表示,拷贝进的Buffer
//参数二表示,拷贝进Buffer的开始偏移量
//参数三表示,源Buffer的开始拷贝偏移量
//参数四表示,源Buffer的结束拷贝偏移量
s_buf.copy(t_buf, 0, 0, 6);
console.log(t_buf.toString());

通过 Buffer.concat() 可以合并多个Buffer,返回一个新Buffer

let buf1 = Buffer.alloc(6);
buf1.write('hello,');
let buf2 = Buffer.alloc(6);
buf2.write('世界');
let buf3 = Buffer.concat([buf1, buf2]);
console.log(buf3.toString());
//如果合并后的Buffer字节数大于设置的值,则会截断
let buf4 = Buffer.concat([buf1, buf2], 9);
console.log(buf4.toString());

判断是否为一个Buffer

console.log(Buffer.isBuffer({'name': 'test'}));
console.log(Buffer.isBuffer(Buffer.from('test')));

通过 Buffer.byteLength() 获取字符串字节长度

console.log(Buffer.byteLength('你好,世界'));

希望本文所述对大家node.js程序设计有所帮助。

Javascript 相关文章推荐
JavaScript delete操作符应用实例
Jan 13 Javascript
Mootools 1.2教程 滑动效果(Slide)
Sep 15 Javascript
JavaScript表单通过正则表达式验证电话号码
Mar 14 Javascript
了不起的node.js读书笔记之node的学习总结
Dec 22 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
Jun 23 Javascript
教你用javascript实现随机标签云效果_附代码
Mar 16 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
Apr 29 Javascript
AngularJS基础 ng-click 指令示例代码
Aug 01 Javascript
Node.js 数据加密传输浅析
Nov 16 Javascript
Web纯前端“旭日图”实现元素周期表
Mar 10 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
Jul 04 jQuery
JavaScript Image对象实现原理实例解析
Aug 26 Javascript
node.js中事件触发器events的使用方法实例分析
Nov 23 #Javascript
javascript 原型与原型链的理解及实例分析
Nov 23 #Javascript
jquery 插件重新绑定的处理方法分析
Nov 23 #jQuery
微信小程序实现录音功能
Nov 22 #Javascript
小程序实现按下录音松开识别语音
Nov 22 #Javascript
小程序采集录音并上传到后台
Nov 22 #Javascript
webpack优化之代码分割与公共代码提取详解
Nov 22 #Javascript
You might like
linux下编译安装memcached服务
2014/08/03 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
use jscript List Installed Software
2007/06/11 Javascript
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
js 页面元素的几个用法总结
2013/11/18 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
详解基于webpack&gettext的前端多语言方案
2019/01/29 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
[01:31]完美与DOTA2历程
2014/07/31 DOTA
Python中的两个内置模块介绍
2015/04/05 Python
在Django的模型中执行原始SQL查询的方法
2015/07/21 Python
python WindowsError的错误代码详解
2017/07/23 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
Python实现FLV视频拼接功能
2020/01/21 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
python 实现音频叠加的示例
2020/10/29 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
美国眼镜网站:LensCrafters
2020/01/19 全球购物
公务员个人自我评价分享
2013/11/06 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
庆祝儿童节标语
2014/10/09 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
2015暑期社会实践调查报告
2015/07/14 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android