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中Buffer缓冲器的使用的更多相关文章
- node.js中buffer需要知道的一些点
本文为阅读朴灵大大的<深入浅出node.js>笔记: 在前端开发的时候,我们不曾用过buffer,也没得用.buffer是node环境引入的,用来方便应对二进制数据的处理.这里我们对它应该 ...
- 学废了系列 - WebGL与Node.js中的Buffer
WebGL 和 Node.js 中都有 Buffer 的使用,简单对比记录一下两个完全不相干的领域中 Buffer 异同,加强记忆. Buffer 是用来存储二进制数据的「缓冲区」,其本身的定义和用途 ...
- Node.js学习 - Buffer
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型.但在处理像TCP流或文件流时,必须使用到二进制数据. 因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...
- 在Node.js中使用RabbitMQ系列二 任务队列
在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心 ...
- node.js中process进程的概念和child_process子进程模块的使用
进程,你可以把它理解成一个正在运行的程序.node.js中每个应用程序都是进程类的实例对象. node.js中有一个 process 全局对象,通过它我们可以获取,运行该程序的用户,环境变量等信息. ...
- node.js中使用http模块创建服务器和客户端
node.js中的 http 模块提供了创建服务器和客户端的方法,http 全称是超文本传输协议,基于 tcp 之上,属于应用层协议. 一.创建http服务器 const http = require ...
- node.js中通过dgram数据报模块创建UDP服务器和客户端
node.js中 dgram 模块提供了udp数据包的socket实现,可以方便的创建udp服务器和客户端. 一.创建UDP服务器和客户端 服务端: const dgram = require('dg ...
- node.js中stream流中可读流和可写流的使用
node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...
- node.js中fs文件系统模块的使用
node.js中为我们提供了fs文件系统模块,实现对文件或目录的创建,修改和删除等操作. fs模块中,所有的方法分为同步和异步两种实现. 有 sync 后缀的方法为同步方法,没有 sync 后缀的方法 ...
随机推荐
- 第一章 Html+Css使用总结(下)
1 开场 <!DOCTYPE html> <html lang="en"> <head> <!-- 对于中文网页需要使用 <meta ...
- docker基本命令使用
学会使用docker命令帮助 docker help 子命令 查看docker镜像 docker images 搜索镜像 docker search 镜像名 下载镜像 docker pull 镜像名 ...
- springboot 集成mybatis plus3
gradle: compile group: 'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.0.1' MybatisPl ...
- Unity外包团队:Daydream控制器只提供了3个自由度
HTC Vive,Oculus Rift以及微软即将推出的MR头显都拥有6自由度的运动控制器,这意味着你在虚拟世界中可以任意摆动你的手.然而,Daydream控制器只提供了3个自由度,这对于手部运动具 ...
- 计算机信息系统安全保护等级划分准则(GB 17859-1999)
概述 计算机信息系统安全保护等级划分准则(GB 17859-1999) 1 范围 本标准规定了计算机系统安全保护能力的五个等级,即: 第一级:用户自主保护级: 第二级:系统审计保护级: 第三级:安全标 ...
- 【剑指offer】数组中只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. 思路1:使用HashMap存上所有的数字,数字作为Key,Value为对应的出现次数.这种做法可以 ...
- jenkins搭配git 从远程端拉取代码回来执行的问题
jenkins上git 拉取回来的代码是在 工作区的文件夹里面(默认每次拉取最新的版本下来的)(不是自己本地仓库的那个) (晕~~,一开始以为是拉取回自己的本地仓库) 找到jenkins git里面 ...
- nginx的启动,停止和重启
启动 启动代码格式:nginx安装目录地址 -c nginx配置文件地址 例如: [root@LinuxServer sbin]# /usr/local/nginx/sbin/nginx -c /us ...
- Error Code: 1786 Statement violates GTID consistency: CREATE TABLE ... SELECT.
1.错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:call account_check_main('20180511') 错误 ...
- mysqldump备份与恢复笔记
mysql> show databases; +--------------------+ | Database | +--------------------+ | inf ...