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 相关文章推荐
ECMAScript 基础知识
Jun 29 Javascript
javascript网页关闭时提醒效果脚本
Oct 22 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
Jan 22 Javascript
jquery给图片添加鼠标经过时的边框效果
Nov 12 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
Aug 09 Javascript
关于Vue实现组件信息的缓存问题
Aug 23 Javascript
React注册倒计时功能的实现
Sep 06 Javascript
基于VUE实现的九宫格抽奖功能
Sep 30 Javascript
微信小程序API—获取定位的详解
Apr 30 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
May 14 Javascript
关于JS解构的5种有趣用法
Sep 05 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
Nov 07 jQuery
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
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
2016/08/31 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
使用python实现knn算法
2017/12/20 Python
python如何拆分含有多种分隔符的字符串
2018/03/20 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
美国半成品食材配送服务商:Home Chef
2018/01/25 全球购物
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
工程部主管岗位职责
2015/02/12 职场文书
金正昆讲礼仪观后感
2015/06/11 职场文书
毕业典礼致辞
2015/07/29 职场文书