在客户端JavaScript脚本代码中,对于二进制数据并没有提供一个很好的支持.然而,在处理TCP流或者文件流时,必须要处理二进制数据.因此,在Node.Js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓冲区.
在Node.js中,Buffer类是一个可以在任何模块中被利用的全局类,不需要为该类的使用而加载任何模块.我们可以使用new关键字来创建该类的实例对象.Buffer类拥有三种形式的构造函数.
1.只需要将缓冲区大小(以字节为单位)指定为构造函数的参数.
new Buffer(size)
被创建的Buffer对象拥有一个length属性,属性值为缓冲区的大小.
打开终端输入一些命令来创建Buffer对象并查看缓冲区的大小,输入命令可以看到结果(在命令行窗口中使用十六进制数值来显示其中的二进制数据).
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> buf = new Buffer(100);
<Buffer b8 ee 3e 8b 0a 7f 00 00 c0 a5 cb 01 00 00 00 00 c0 a5 cb 01 00 00 00 00 0a 00 00 00 00 00 00 00 48 a6 cb 01 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 ...>
>
2.构造函数可以直接使用一个数组来初始化缓冲区.
new Buffer(array)
在这种形式构造函数中,他使用一个存放了需要被指定数值的数组来作为构造函数的参数.
打开终端输入一些命令以使用数组创建Buffer对象.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> buf = new Buffer([0,1,2]);
<Buffer 00 01 02>
>
3.构造函数是直接使用一个字符串来初始化缓冲区.
new Buffer(str,[encoding])
在这种形式的构造函数中,使用两个参数,其中第一个参数是必须要指定的参数,参数值为用于初始化缓冲区的字符串,第二个参数为一个用于指定文字编码格式的字符串,默认值为"utf-8".
打开终端输入一些命令以使用字符串参数创建Buffer对象.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> buf = new Buffer('我喜欢编程')
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
>
字符串的长度与缓冲区的长度
在Node.js中,一个字符串的长度与根据该字符串所创建的缓冲区的长度并不相同,因为计算字符串的长度时,以字节作为一个单位,而在计算缓冲区的长度时,以字节数作为一个单位.
我们来做个实例,针对"我喜欢编程"这个字符串,该字符串对象的length属性值与根据该字符串创建的Buffer对象的length属性值并不相同,因为字符串对象的length属性获取的是文字个数,而Buffer对象的length属性值获取的是缓冲区的长度,也就是缓冲区的字节数.
打开终端输入一些命令来创建一个字符串,然后使用该字符串创建一个Buffer对象,然后在控制台中输出字符串长度与缓冲区的长度.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> str = '我喜欢编程'
'我喜欢编程'
> buf = new Buffer(str);
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> str.length;
5
> buf.length;
15
>
附加点知识,可以使用以0开始的序号去取字符串对象或缓冲区中的数据,但是,在获取数据时,字符串对象也是以字节作为一个单位,而缓冲区对象(Buffer对象)以字节作为一个单位,假设,针对一个引用了字符串对象的str变量来说,str[2]获取的第三个文字,而针对一个引用缓冲区对象的buf变量来说,buf[2]获取的是缓冲区中第三个字节数据转换为整数后的数值.
打开终端输入一些命令以使用"我喜欢编程"创建一个字符串与一个Buffer对象并在控制台中输出字符串中第三个文字和缓冲区中第三个直接数据.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> str = "我喜欢编程"
'我喜欢编程'
> buf = new Buffer(str)
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> str = '我喜欢编程'
'我喜欢编程'
> str [2];
'欢'
> buf [2];
145
>
还有一点就是,字符串对象一旦创建之后就不能在修改
打开终端输入一些命令以使用"我喜欢编程"创建一个字符串对象并对它进行修改,然后在控制台输出结果.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> str = '我喜欢编程'
'我喜欢编程'
> str [2] = '囍'
'囍'
> str;
'我喜欢编程'
>
而Buffer对象是可以被修改的.可以通过序号来修改其中某个字节处的数据.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> buf = new Buffer('我喜欢编程')
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> buf [2] =0;
0
> buf;
<Buffer e6 88 00 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
>
Buffer有一个用于取出指定位置处数据的slice方法,该方法的使用跟string对象的slice方法相同.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> str = '我喜欢编程'
'我喜欢编程'
> buf = new Buffer(str);
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> str.slice(2,4);
'欢编'
> buf.slice(2,4);
<Buffer 91 e5>
>
理想是人生的太阳