Buffer
类是做为 Node.js API 的一部分引入的,用于在 TCP 流、文件系统操做、以及其余上下文中与八位字节流进行交互Buffer
是用来处理二进制数据流的Buffer
实例相似于整数数组,可是其长度大小固定(建立后不可修改)Buffer
c++ 在V8堆外分配的物理内存Buffer
是一个全局变量,直接挂载在global下Buffer.alloc()
Buffer.alloc(10)
第一个参数为长度,不填内容(第二个参数),即用 0 填充Buffer.alloc(10, 1)
第二参数为填充内容console.log(Buffer.alloc(10)) // 建立一个长度为10的buffer
// 输出结果: <Buffer 00 00 00 00 00 00 00 00 00 00>
console.log(Buffer.alloc(10,1)) // 建立一个长度为10的buffer 而且使用1做为默认位的填充
// 输出结果: <Buffer 01 01 01 01 01 01 01 01 01 01>
复制代码
Buffer.allocUnsafe()
Buffer
。Buffer
.alloc() 更快,Buffer
实例可能包含旧数据,console.log(Buffer.allocUnsafe(10))
// <Buffer 98 fe a5 8d fa 01 00 00 58 ff> 未经初始化的混乱Buffer
复制代码
Buffer.from()
Buffer.from([1,2,3])
建立一个包含 [0x1, 0x2, 0x3] 的 Buffer。Buffer.from('test', 'latin1')
建立一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Bufferconsole.log(Buffer.from([1,2,3]))
// <Buffer 01 02 03>
console.log(Buffer.from('test', 'latin1'))
// <Buffer 74 65 73 74>
复制代码
Buffer.byteLength()
Buffer.byteLength('test') // 4 英文字母占位一个字节
Buffer.byteLength('测试') // 6 中文占位三个字节
复制代码
Buffer.isBuffer(obj)
Buffer.isBuffer({}) false
Buffer.isBuffer(Buffer.from([1,2,3])) true
复制代码
// 用含有三个 `Buffer` 实例的数组建立一个单一的 `Buffer`。
const buf1 = Buffer.alloc(10);
const buf2 = Buffer.alloc(14);
const buf3 = Buffer.alloc(18);
const totalLength = buf1.length + buf2.length + buf3.length;
console.log(totalLength);
// 打印: 42
// 若是已知长度,则明确提供长度会更快
const bufA = Buffer.concat([buf1, buf2, buf3], totalLength);
console.log(bufA);
// 打印: <Buffer 00 00 00 00 ...>
console.log(bufA.length);
// 打印: 42
复制代码
buf.length
const buf = Buffer.from('1212!')
buf.length
复制代码
buf.toString([encoding[, start[, end]]])
console.log(b.toString())
复制代码
buf.fill()
const buf1 = Buffer.alloc(10)
console.log(buf1.fill('e',2,5)) //<Buffer 00 00 65 65 65 00 00 00 00 00>
```
复制代码
buf.equals(otherBuffer)
const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('414243', 'hex');
const buf3 = Buffer.from('ABCD');
console.log(buf1.equals(buf2));
// 打印: true
console.log(buf1.equals(buf3));
// 打印: false
复制代码
buf.indexOf()
相似于数组的 Array.indexOf()
buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
// 建立两个 `Buffer` 实例。
const buf1 = Buffer.allocUnsafe(26);
const buf2 = Buffer.allocUnsafe(26).fill('!');
for (let i = 0; i < 26; i++) {
// 97 是 'a' 的十进制 ASCII 值。
buf1[i] = i + 97;
}
// 拷贝 `buf1` 中第 16 至 19 字节偏移量的数据到 `buf2` 第 8 字节偏移量开始。
buf1.copy(buf2, 8, 16, 20);
console.log(buf2.toString('ascii', 0, 25));
// 打印: !!!!!!!!qrst!!!!!!!!!!!!!
复制代码
// 建立一个 `Buffer`,并拷贝同一 `Buffer` 中一个区域的数据到另外一个重叠的区域。
const buf = Buffer.allocUnsafe(26);
for (let i = 0; i < 26; i++) {
// 97 是 'a' 的十进制 ASCII 值。
buf[i] = i + 97;
}
buf.copy(buf, 0, 4, 10);
console.log(buf.toString());
// 打印: efghijghijklmnopqrstuvwxyz
复制代码
string_decoder
// 如何去除buffer中文乱码
const buf = Buffer.from('中文乱码在此!')
// string_decoder 是buffer的内置模块
// 将 Buffer 实例写入 StringDecoder 实例时,将使用内部缓冲区来确保已解码的字符串不包含任何不完整的多字节字符。
// 它们保存在缓冲区中,直到下一次调用 stringDecoder.write() 或调用 stringDecoder.end() 为止
// 简单说就是会自动识别多字节字符,代码操做出现不完整的状况下不作输出,
//而是存储在内存中,在下一次操做中拼接在起始位置
const { StringDecoder } = require('string_decoder')
const decoder = new StringDecoder('utf8')
for(let i = 0; i< buf.length; i+=5) {
// 生成未初始化的Buffer
const b = Buffer.allocUnsafe(5)
// 拷贝
buf.copy(b, 0, i)
console.log(b.toString())
// 结果
// 中�
// �乱�
// ��在
// 此�
// ��4�║
}
for(let i = 0; i< buf.length; i+=5) {
// 生成未初始化的Buffer
const b = Buffer.allocUnsafe(5)
// 拷贝
buf.copy(b, 0, i)
console.log(decoder.write(b))
}
复制代码
closenode