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 相关文章推荐
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
Dec 23 Javascript
js同时按下两个方向键
Dec 01 Javascript
Asp.net下利用Jquery Ajax实现用户注册检测(验证用户名是否存)
Sep 12 Javascript
JS判断表单输入是否为空(示例代码)
Dec 23 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
Jun 15 Javascript
JS数组的遍历方式for循环与for...in
Jul 31 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
Dec 20 Javascript
node.js操作mongodb简单示例分享
May 25 Javascript
vue中实现先请求数据再渲染dom分享
Mar 17 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
Sep 08 Javascript
JS typeof fn === 'function' && fn()详解
Aug 22 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
Dec 10 Vue.js
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
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
PHP中替换换行符的几种方法小结
2012/10/15 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
PHP Trait功能与用法实例分析
2020/06/03 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
微信小程序如何获取手机验证码
2018/11/04 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
js实现随机点名程序
2020/09/17 Javascript
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
python批量图片处理简单示例
2019/08/06 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
详解canvas.toDataURL()报错的解决方案全都在这了
2020/03/31 HTML / CSS
Origins加拿大官网:雅诗兰黛集团高端植物护肤品牌
2017/11/19 全球购物
Clarks鞋法国官方网站:英国其乐鞋品牌
2018/02/11 全球购物
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
一些网络技术方面的面试题
2014/05/01 面试题
社区先进事迹材料
2014/05/19 职场文书
企业安全生产标语
2014/06/06 职场文书
表扬稿格式范文
2015/01/16 职场文书
微信小程序和php的登录实现
2021/04/01 PHP