Buffer主要用于操作二进制流,Buffer类在全局作用域中,因此可以直接用,无需用require引入,Buffer类似于整数数组,但是不同的是它的长度是固定的,无法改变。C++代码在V8堆外分配物理内存。
// 创建一个长度为10,且用9填充的Buffer const buff1 = Buffer.alloc(10,9) console.log(buff1) /* allocUnsafe与alloc方法类似,不同的是它没有实例化,所以调用的时候和可能有老数据,因此使用之前要使用 fill() 或 write() 重写。最后补充一点它的速度比alloc快,但是介意一般情况使用alloc */ // 创建一个包含1,2,4的Buffer const buff2 = Buffer.from([1,2,5]) console.log(buff2)下面总结几个比较常用的api
1.Buffer.byteLength() 返回字符串的实际字节长度
const buff3 = Buffer.byteLength("hello"); const buff4 = Buffer.byteLength("你好"); console.log(buff3) console.log(buff4)2.Buffer.isBuffer(obj),如果 obj 是一个 Buffer,则返回 true,否则返回 false。
const buff5 = Buffer.isBuffer(Buffer.from([1,3,5])) const buff6 = Buffer.isBuffer({}) console.log(buff5,buff6);3.Buffer.concat(),合并buffer并返回一个新的Buffer
const buff1 = Buffer.from("I ") const buff2 = Buffer.from("name ") const buff3 = Buffer.from("lixian") const buf = Buffer.concat([buff1,buff2,buff3]) console.log(buf.toString())4.buf.length,返回内存中分配给 buf 的字节数。 不一定反映 buf 中可用数据的字节量。
const buf = Buffer.alloc(1225) console.log(buf.length) const buf2 = Buffer.from('I am girl') console.log(buf2.length)5.buf.toString([encoding[, start[, end]]])
根据 encoding 指定的字符编码将 buf 解码成字符串。hex将buf1转为16进制,具体内容可查看文档http://nodejs.cn/api/buffer.html#buffer_buf_tostring_encoding_start_end
const buf1 = Buffer.from("asdfasdf"); console.log(buf1.toString('hex'));6.buf.fill(value[, offset[, end]][, encoding])
value <string> | <Buffer> | <Uint8Array> | <integer> 用来填充 buf 的值。offset <integer> 开始填充 buf 的偏移量。默认值: 0。end <integer> 结束填充 buf 的偏移量(不包含)。默认值: buf.length。encoding <string> 如果 value 是字符串,则指定 value 的字符编码。默认值: 'utf8'。 const buf1 = Buffer.allocUnsafe(10); console.log(buf1) console.log(buf1.fill(10,2,6))
7. buf.equals()
比较两个 buffer的值,如果相等返回true,如果不想等返回false
const buf1 = Buffer.from('abc'); const buf2 = Buffer.from('abc') console.log(buf1.equals(buf2))8.buf.indexOf() 查找指定的值
buf 中首次出现 value 的索引,如果 buf 没包含 value 则返回 -1
const buf1 = Buffer.from('test'); console.log(buf1.indexOf('st'))