Buffer
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
1.Buffer解释
- 在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。成员都是0-255的整数值,即
一个8位字节
- Buffer 库为 Node.js 带来了一种
存储原始数据
的方法, Node.js 处理二进制数据的一个接口
,是一个构造函数 - 当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。
- 一个 Buffer
类似于一个整数数组
,但它对应于 V8 堆内存之外的一块原始内存。
2.Buffer支持的字符编码格式
编码格式 | 解释 |
---|---|
ascii | 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。 |
utf8 | 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。 |
utf16le( ucs2) | 2 或 4 个字节,小字节序编码的 Unicode 字符。 |
base64 | Base64 编码。 |
latin1( binary) | 一种把 Buffer 编码成一字节编码的字符串的方式。 |
hex | 将每个字节编码为两个十六进制字符。 |
3.TypeArray
TypeArray对象 :通用的固定长度缓冲区类型,允许读取缓冲区中的二进制数据。
类型 | 大小 | 描述 | Web IDL类型 | C 类型 |
---|---|---|---|---|
Int8Array | 1 | 8位有符号整数 | byte | signed char |
Uint8Array | 1 | 8位无符号整数 | octet | unsigned char |
Uint8ClampedArray | 1 | 8位无符号整数 (clamped) | octet | unsigned char |
Int16Array | 2 | 16位有符号整数 | short | short |
Uint16Array | 2 | 16位无符号整数 | unsigned short | unsigned short |
Int32Array | 4 | 32位有符号整数 | long | int |
Uint32Array | 4 | 32位无符号整数 | unsigned long | unsigned int |
Float32Array | 4 | 32位IEEE浮点数 | unrestricted float | float |
Float64Array | 8 | 64位IEEE浮点数 | unrestricted double | double |
Buffer类基于Unit8Array,占一个字节
4.创建Buffer类(举例)
- 申请一个 10 个单元的缓冲区:
const buf1=Buffer.alloc(10);
每个单元都用0来填充
const buf2=Buffer.alloc(10,5)
每个单元都用5来填充 - 创建包含[1,2,3]的缓冲区:
const buf3 = Buffer.from([1, 2, 3]);
- 构造函数:
var hello=new Buffer([0x48,0x65,0x6c,0x6c,0x6f])
=>hello
5.Buffer类的方法
buf.write()
:写入缓冲区
buf = Buffer.alloc(256);
len = buf.write("www.runoob.com");
console.log("写入字节数 : "+ len);
//结果为:14
//返回的是实际写入的大小
buf.toString()
:从缓冲区读取数据
// 使用 'utf8' 编码, 并输出: abcde
console.log( buf.toString('utf8',0,5));
buf.toJSON()
:将Buffer转换为JSON对象
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
//当字符串化一个 Buffer 实例时,JSON.stringify() 会隐式地调用该 toJSON()。
const json = JSON.stringify(buf);
// 输出: {"type":"Buffer","data":[1,2,3,4,5]}
console.log(json);
buf.compare(otherBuffer);
:缓冲区比较
var result = buffer1.compare(buffer2);
buf.copy()
:拷贝缓冲区
var buf1 = Buffer.from('abcdefghijkl');
var buf2 = Buffer.from('RUNOOB');
//将 buf2 插入到 buf1 指定位置上
buf2.copy(buf1, 2);
buf.slice()
:缓冲区剪裁
var buffer1 = Buffer.from('runoob');
// 剪切缓冲区
var buffer2 = buffer1.slice(0,2);
buf.length
:返回缓冲区长度
var buffer = Buffer.from('www.runoob.com');
// 缓冲区长度
console.log("buffer length: " + buffer.length);
//结果为:14
Buffer.concat()
:合并缓冲区(可指定长度)
var buffer3 = Buffer.concat([buffer1,buffer2]);