Buffer
可以在TCP流或者文件系统操作等场景中处理二进制数据流。
Buffer实例类似于整数数组,但是Buffer大小固定、且在V8堆外分配物理内存,Buffer的大小在创建时确定,无法调整。
常用Buffer
类方法
注意:(以下方法Node新版本中已被废弃,不建议使用)
不建议使用的有如下:newBuffer(array)
、newBuffer(arrayBuffer)
、newBuffer(buffer)
、newBuffer(size)
、newBuffer(string)
。
替代方法有如下:Buffer.from()
、Buffer.alloc()
、Buffer.allocUnsafe()
。
-
Buffer.from(array)
返回一个新建的包含所提供的字节数组的副本的Buffer。
let buf1 = Buffer.from([1,2,3,4]) // <Buffer 01 02 03 04>
let buf2 = Buffer.from([[0x62, 0x75, 0x66, 0x66, 0x65, 0x72]]) // <Buffer 62 75 66 66 65 72>
buf2.toString() // 'buffer'
-
Buffer.from(arrayBuffer[,byteOffset[,length]])
返回一个新建的与给定的ArrayBuffer共享同一内存的Buffer。
const arr = new Unit16Array(2)
const buf = Buffer.from(arr.buffer) // 改动arr也会影响到buf
-
Buffer.from(buffer)
返回一个新建的包含所提供的Buffer的内容的副本的Buffer。
let buf1 = Buffer.from('buffer')
let buf2 = Buffer.from(buf1)
buf1[0] = 0x61
console.log(buf1) // auffer
console.log(buf2) // buffer
-
Buffer.from(string[,encoding])
返回一个新建的包含所提供的字符串的副本的Buffer。 -
Buffer.alloc(size[,fill[,encoding]])
返回一个指定大小的被填满的Buffer实例。这个方法会明显地比Buffer.allocUnsafe(size)
慢,但可确保新创建的Buffer实例绝不会包含旧的和潜在的敏感数据。
// size: 新建的Buffer期望的长度
// fill:<string | Buffer | integer>用来预填充新建的Buffer的值,默认:0
// encoding:如果fill是字符串,那么这个就是字符编码,默认:utf-8
const buf = Buffer.alloc(5) // <Buffer 00 00 00 00 00>
const buf = Buffer.alloc(5, 'a') // <Buffer 61 61 61 61 61>
const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64') // 输出: <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64> hello world
-
Buffer.allocUnsafe(size)
与Buffer.allocUnsafeSlow(size)
返回一个新建的指定size的Buffer,但它的内容必须被初始化,可以使用buf.fill(0)
或完全写满。
开发者应该把所有正在使用的newBuffer()
构造函数迁移到新的API上。
是什么造成了Buffer.allocUnsafe()
和Buffer.allocUnsafeSlow()
不安全?
是因为调用这两个方法时,被分配的内存都是未被初始化的(未被0填充),虽然这样的设计使得内存的分配非常快(性能优势),但是已经分配的内存段可能包含潜在的敏感旧数据。使用通过Buffer.allocUnsafe()
创建的没有被完全重写内存的Buffer,在Buffer内存可读的情况下,有可能泄露它的旧数据。
Buffer
与字符编码
通过指定的编码进制,可以在Buffer与普通的字符串之间转换。目前支持的ascii
,utf-8
,base-64
,binary
,hex
const buf = Buffer.from('helloworld', 'ascii')
buf.toString('hex')
buf.toString('base64')
Buffer
与ES6
迭代器
同样,Buffer实例可以使用迭代器for...of进行遍历,遍历器的buf.values()
、buf.keys(
)、buf.entries()
可以用于创建迭代器。
const buf = Buffer.from([1, 2, 3])
for(let b of buf){
console.log(b) // 1 2 3
}
类方法
-
Buffer.byteLength(string[, encoding])
返回一个字符串的实际字节长度。String.prototype.length
是返回字符串的字符数。
注意字符数和字节长度是不同,英文字母中是相同的,但是当有中文时或者unicode编码(它是用两个字节来编码一个字符)是不同的。
'中文hello'.length // 7
Buffer.byteLength('中文hello', 'uft-8') // 11
-
Buffer.compare(buf1, buf2)
通常用于Buffer实例数组的排序。(有点像sort()
方法) -
Buffer.concat(list[, totalLength])
合并Buffer
const buf1 = Buffer.alloc(10)
const buf2 = Buffer.alloc(14)
const buf3 = Buffer.alloc(18)
const totalLength = buf1.length + buf2.length + buf3.length // 42
const bufA = Buffer.concat([buf1, buf2, buf3], 41) // 截断为totalLength的长度,缺少的部分会用00补充
cosnole.log(buf.length) // 41
-
Buffer.isBuffer(obj)
,是一个buffer返回true -
Buffer.isEncoding(encoding)
,是一个支持的字符编码返回true -
Buffer.entries()
,创建并返回一个[index, byte]形式的迭代器
cosnt buf = Buffer.from('buffer')
for(let pair of buf.entries()) {
console.log(pair) // [0, 98],[1, 117]...
}
-
buf.equals(otherBuffer)
,如果buf与otherBuffer具有完全相同的字节就返回true
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。