不记得第一次听到Buffer这个词是在什么情况下了,当时让师傅给我解释的时候,他只给了我三个词:缓冲区、二进制、读与写。用一句话形容就是,Buffer是一块可以以二进制写入和读取数据,并提供了一组方法进行操作的缓冲区。大概明白了是这个意思,但是并不知道在node中怎样使用它,也不了解它能在项目中产生什么样的作用,正好Scott的课程也讲到了Buffer,那就来深入了解一下吧。
为什么要使用buffer呢?因为javascript中的字符串是以utf-8的格式存储的,处理二进制的能力很弱,而网络层对于不同资源的请求和响应都是用二进制的形式来交互的。
一、实例化Buffer
Buffer在node里面是可以直接访问的,不需要使用require来引入。在node模式下输入Buffer,如下图。我们可以发现,Buffer是个对象,也是一个构造函数,具有自己的属性和静态方法。
poolSize表示内存载体的容量。
isBuffer判断当前对象是否是buffer对象。
compare用来判断两个buffer对象的相对位置,一般来做按字符串的排序。
isEncoding用来判断buffer是否支持某种编码。
concat用于将几个buffer对象连接成一个新的buffer对象。
byteLength用于获得指定编码下字符串所占的字节数,中文字符是3个字节。
通过Buffer new出来的实例实际代表了一段内存,是一个成员为整数值的数组。在Buffer对象与字符串相互转化的时候,是需要指定编码格式的,如果不指定,默认是utf-8的格式转化的,如下图。
此外,也可以给Buffer指定长度,分配一段内存区间,如果写入的内容超出长度,超出的部分是不会被缓冲的,如下图,末尾的9是没有被缓冲的。
如果是用数组实例化的Buffer对象,我们可以用下标来访问其中的某个值。但如果数组的值是小数,我们获取时,返回的值会取整,如下图。
二、Buffer的使用
除了上面例子中使用的buffer方法,还有其他实例方法,用于对二进制数据进行操作,和js中对数组的操作类似。
buffer一旦被实例化,长度是固定了的,超出的部分不会写入,缺少的部分会使用原来的数据补全。
copy方法
buffer.copy(target, tStart, sStart, sEnd = buffer.length)
target-必需,复制的目标buffer;
tStart-默认0,目标buffer中从第几个字节开始写;
sStart-默认0,从原始buffer中获取数据的初始位置;
sEnd-默认原始buffer对象的长度,从原始buffer中获取数据的结束位置