1. 简介
Buffer是一个类似于数组的对象,书写形式为 < 元素 元素 元素 >
;Buffer实际上是一个专门保存二进制数据的<>
的容器
2. 特点
- 大小固定:在创建的时候就确定了,且无法调整
- 性能较好:可以直接对计算机的内存进行操作(因为计算机也是二进制,Buffer也是二进制,操作起来非常方便)
- 每个元素大小为1字节(byte)
关于单位换算
1Bit 对应的是1个二进制
8Bit = 1 字节(Byte1)
1024Byte = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
3. 使用
3.1 Buffer创建
- 直接创建 Buffer.alloc
创建一个()里数据为长度的Buffer
每次创建都是一样且为初始化
- 不安全创建 Buffer.allocUnsafe
每次创建都不一样
创建Buffer的时候,该方法没有进行空间的初始化
- 通过数组和字符串创建 Buffer.from
代码书写
// 直接创建 Buffer.alloc
let buf =Buffer.alloc(9);
// 输出后--> <Buffer 00 00 00 00 00 00 00 00 00 >
// 每次创建都是一样且为初始化
// 创建一个()里数据为长度的Buffer
//--------------------------------------------
// 不安全创建 Buffer.allocUnsafe
let buf = Buffer.allocUnsafe(9);
// 输出后--> <Buffer 01 23 54 23 78 1a 56 34 59>
// 每次创建都不一样
// 创建Buffer的时候,该方法没有进行空间的初始化
// ------------------------------------------
// 通过数组和字符串创建 Buffer.from
let buf = Buffer.from('wudipakeke');
// 输出后--> <Buffer 77 75 64 69 70 61 6b 65 6b 65>
3.2 Buffer 的读取和写入
Buffer 的读取和写入是一样的
通过索引对Buffer内的数据进行读取(类似与数组的读取方法)
- 对每一个数据单独读取&写入,通过索引下标方式读取&写入,读取&写入为十进制的数据。
把ASCCII 中的数字转换为字符,通过
string.fromCharCode()
方法
- 将Buffer数据整体转换为字符串,通过
toString()
方法。
代码书写
// 读取
// 通过索引读取Buffer中的数据
let buf = Buffer.from('wudipakeke');
buf[0];
// 119 输出为十进制的数字(默认输出)
// 可以把十进制的数字转换为二进制的数字
// ------------------------------------------
// 用 toString() 方法把Buffer转换为字符串
buf.toString();
// 输出为 wudipakeke
// =========================================
// 写入(设置)
// 通过索引写入(设置)Buffer中的数据
buf[0] = 120;
//-------------------------------------
buf.toString()
// 输出为 xwudipakeke
扩展
// 把ASCCII 中的数字转换为字符
string.fromCharCode(119);
// 把ASCCII 中的字符转换为数字
'字符'.charCodeAt();
3.3 关于溢出
溢出的高位数据会舍弃(高位舍弃)
高位舍弃过程
是从左边开始舍弃 --> 只保留后八位 --> 转化为十进制 --> 再从ASCCII表找到相应字符
3.4 关于中文
一个 UTF-8 的中文字符大多数情况都是占 3 个字节
中文汉字:
字节数 : 2;编码:GB2312
字节数 : 2;编码:GBK
字节数 : 2;编码:GB18030
字节数 : 1;编码:ISO-8859-1
字节数 : 3;编码:UTF-8
字节数 : 4;编码:UTF-16
字节数 : 2;编码:UTF-16BE
字节数 : 2;编码:UTF-16LE
英文字母:
·字节数 : 1;编码:GB2312
字节数 : 1;编码:GBK
字节数 : 1;编码:GB18030
字节数 : 1;编码:ISO-8859-1
字节数 : 1;编码:UTF-8
字节数 : 4;编码:UTF-16
字节数 : 2;编码:UTF-16BE
字节数 : 2;编码:UTF-16LE