Buffer缓冲区
大约 5 分钟
Buffer缓冲区
以下为学习过程中的极简提炼笔记,以供重温巩固学习
学习准备
准备工作
完成AJAX原理
学习目的
理解Buffer
Buffer
Buffer定义及创建
定义:Buffer中文意为缓冲区,是一个类似于数据的对象,用于表示固定长度的字节序列。
简单理解:Buffer就是一段固定长度的内存空间,主要由于处理二进制的数据。
特点:
- 大小固定,且无法调整(与数组不一样,数组可以新增、删除元素)
- 性能较好,可以直接对计算机内存进行操作
- 每一个元素,就是单个Buffer元素,大小为一个字节
- 每一个0或者1表示是一个Bit
- 而8个Bit所组成的空间把它称之为是一个字节
- 是JavaScript内置的模块,不需要手动导入就可以使用
- 可以认为buffer是一个全局变量,然后alloc单词意为分配,是buffer对象里边的一个方法
- Buffer.alloc这种方法创建的buffer,每一个二进制位都会归零(对内存进行清0)
- Buffer.allocUnsafe本意是不安全的意思,通过这种方法所创建的Buffer,可能使用了复用的内存空间,可能会包含旧的内存数据,因为内存是可以复用的(不清空内存)
- Buffer.allocUnsafe优点,创建速度快,无需归零
- Buffer.from可将一个字符串或者数组转为buffer,
- 字符串转换时,会将每一个字母都会转换为这个字符在Unicode/ASCII码表的十六进制数
- 数组转换时,每一个数字都会转成二进制,然后存入buffer
创建:
- Buffer.alloc
- Buffer.allocUnsafe
- Buffer.from
Buffer的三种创建方式buffer.js,在终端中运行 node buffer.js
// alloc方法
let buf = Buffer.alloc(10);
console.log(buf);
// 打印结果00 00 00 00 00 00 00 00 00 00
// allocUnsafe
let buf2 = Buffer.allocUnsafe(10);
console.log(buf2);
// 打印结果00 00 00 00 00 00 00 00 00 00 ,也可能是其他历史内存数据
// from字符串转buffer
let buf3 = Buffer.from('hello');
// from数组转buffer
let buf4 = Buffer.from([105,108,111,118,101,121,111,117]);
console.log(buf3);
// 打印结果 68 65 6c 6c 6f
console.log(buf4);
// 打印结果 68 65 6c 6c 6f
Buffer操作与注意点
Buffer与字符串的转换:
- 通过toString()方法
- 默认按照UTF-8编码方式进行转换
Buffer元素的读:
- Buffer元素类似于数组的一个元素,可以通过中括号+下标的方式来对 buffer 中的元素进行操作
- 默认的将数组元素取出值的方式[],取出的值为10进制数
Buffer元素的写:
- 类似数组赋值,可以直接
数组[第几个元素]=ascii里面的十进制的数
- 类似数组赋值,可以直接
溢出:
- 8个2进制位,所能存储的最大10进制数字是255,也就是二进制下的11111111,16进制下的FF
- 当修改单个字节的值为一个大于255的十进制数组时,会触发舍弃
- 舍弃方式为,将大于8位的舍弃,例:361 = 0001 0110 1001,舍弃前面4个位变为 0110 1001
中文处理:
- 一个UTF-8下中文字符,占三个字节
Buffer数组转字符串,在终端中运行 node buffer.js
// Buffer数组转字符串
let buf4 = Buffer.from([105,108,111,118,101,121,111,117]);
console.log(buf4.toString());
// 打印结果iloveyou
// Buffer元素读
let buf0 = Buffer.from('hello');
console.log(buf0[0]);
// 打印结果:对字母h打印,结果为104
console.log(buf0[0].toString(2));
// 以二进制方式打印结果,为01101000
// 不应该是8位吗?怎么是 7 位?其实在这个第一位的前边,它还有一个0,所以最后它真正所保存的值应该是01101000
// Buffer元素写
let buf5 = Buffer.from('hello');
console.log(buf5);
// 打印结果 68 65 6c 6c 6f
buf[0]=95;
// 打印结果:对字母h打印,结果为5f(ascii里面的十进制的数95,转为16进制5f)
console.log(buf5.toString());
// 打印结果:_ello,95对应是个下划线
// Buffer溢出
let buf6 = Buffer.from('hello');
buf[0]=361;
console.log(buf6);
// 打印结果 69 65 6c 6c 6f
// 中文处理
let buf7 = Buffer.from('你好');
console.log(buf7);
// 打印结果 e4 bd a0 e5 a5 bd