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获取当前ip的代码
May 10 Javascript
jQuery实现定时读取分析xml文件的方法
Jul 16 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
Sep 23 Javascript
Node.js常用工具之util模块
Mar 09 Javascript
vue-resouce设置请求头的三种方法
Sep 12 Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
Jul 30 Javascript
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
Oct 26 Javascript
在微信小程序中保存网络图片
Feb 12 Javascript
详解如何在vue项目中使用layui框架及采坑
May 05 Javascript
JavaScript快速调试的两个技巧
Nov 04 Javascript
vue3.0 项目搭建和使用流程
Mar 04 Vue.js
threejs太阳光与阴影效果实例代码
Apr 05 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
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
2012/06/14 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
js实现将选中内容分享到新浪或腾讯微博
2015/12/16 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
浅谈js中调用函数时加不加括号的问题
2016/07/28 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
es6数值的扩展方法
2019/03/11 Javascript
深入学习JavaScript 高阶函数
2019/06/11 Javascript
js this 绑定机制深入详解
2020/04/30 Javascript
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
python定时关机小脚本
2018/06/20 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
python实现列表中最大最小值输出的示例
2019/07/09 Python
python yield关键词案例测试
2019/10/15 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
中学生检讨书范文
2014/11/03 职场文书