Node之使用Buffer类处理二进制数据
创建Buffer对象
调用new Buffer(size),size为缓存区大小
new Buffer(10)
fill()方法来初始化缓存区中的所有内容
buf.fill(value, [offset], [end])
//value:为需要被写入的数值
//offset:用于指定从第几个字节处开始写入被指定的数值
//end:用于指定将数值一直写入到第几字节处
直接使用一个数组来初始化缓存区
new Buffer(array)
在这种形式的构造函数中,使用一个存放了需要被指定数值的数组来作为构造函数的参数。
直接使用一个字符串来初始化缓存区
new Buffer(str,[encoding]
在这种形式的构造函数中,使用两个参数,其中第一个参数为必须指定的参数,参数值为用于初始化缓存区的字符串,第二个参数值为一个用于指定文字编码格式的字符串,默认值为“utf8”。
在Node.js中,可以使用的编码格式如下
编码 | 说明 |
---|---|
ascii | ASCII字符串 |
utf8 | UTF-8字符串 |
utf16le | UTF-16LE字符串 |
ucs2 | UCS2字符串 |
base64 | 经过BASE64编码后的字符串 |
binary | 二进制数据(不推荐使用) |
hex | 使用十六进制数值表示的字符串 |
字符串长度和缓存区的长度
在Node.js中,一个字符串的长度与根据该字符串所创建的缓存区的长度并不相同。因为在计算字符串的长度时,以文字作为一个单位,而在计算缓存区的长度时,以字节作为一个单位。
Buffer对象的slice方法与该数据共享内存区域,如果修改使用slice方法取出的数据,则缓存区中保存的数据也将被修改。
Buffer对象的toString方法
可以使用Buffer对象的toString方法将Buffer对象中保存的数据转换为字符串
buf.toString([encoding], [start], [end])
在Buffer对象的toString方法中,可以使用三个可选参数,其中第一个参数用于指定Buffer对象中保存的文字编码格式,默认参数值为utf8。第二及第三个参数用于指定被转换数据的起始位置与终止位置,以字节为单位。toString方法返回经
过转换后的字符串。
Buffer对象的write方法
如果要将字符串当作二进制数据来使用,只需将该字符串作为Buffer类的构造函数的参数来创建Buffer对象即可。但是有时我们需要向已经创建的Buffer对象中写入字符串,这时可以使用该Buffer对象的write方法
buf.write(string, [offset], [length], [encoding])
在Buffer对象的write方法中,可以使用四个参数,其中第一个参数为必须指定参数,后三个参数为可选参数。第一个参数用于指定需要写入的字符串,第二个参数offset与第三个参数length用于指定字符串转换为字节数据后的写入位置。字节数据的书写位置为从第1+offset个字节开始到offset+length个字节为止(例如offset为3,length为6,写入位置为从第4字节开始到第9字节为止,包括第4字节与第9字节)。第四个参数用于指定写入字符串时使用的编码格式,默认为utf8格
式。
StringDecoder对象
在使用StringDecoder对象时,首先需要加载Node.js中的string_decoder模块
var StringDecoder = require('string_decoder').StringDecoder;
在加载了string_decoder模块之后,可以创建一个StringDecoder对象,在StringDecoder类的构造函数中,可以使用一个可选参数,该参数用于指定转换字符串时所使用的编码格式,默认参数值为utf8。
var decoder = new StringDecoder([encoding]);
要将Buffer对象中的数据转换为字符串时,可以使用StringDecoder对象的write方法
decoder.write(buffer)
Buffer对象与JSON对象之间的相互转换
在Node.js中,可以使用JSON.stringify方法将Buffer对象中保存的数据转换为一个字符串,也可以使用JSON.parse方法将一个经过转换后的字符串还原为一个数组。
复制缓存数据
当需要将Buffer对象中保存的二进制数据复制到另一个Buffer对象中时,可以使用Buffer对象的copy方法,copy方法的使用方法如下所示。
buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])
在Buffer对象的copy方法中,使用四个参数,其中第一个参数为必须指定的参数,其余三个参数均为可选参数。第一个参数用于指定复制的目标Buffer对象。第二个参数用于指定目标Buffer对象中从第几个字节开始写入数据,参数值为一个小
于目标Buffer对象长度的整数值,默认值为0(从开始处写入数据)。第三个参数用于指定从复制源Buffer对象中获取数据时的开始位置,默认值为0,即从复制源Buffer对象中的第一个字节开始获取数据,第四个参数用于指定从复制源Buffer对象中获取数据时的结束位置,默认值为复制源Buffer对象的长度,即一直获取完毕复制源Buffer对象中的所有剩余数据。
isBuffer方法用于判断一个对象是否为一个Buffer对象
Buffer.isBuffer(obj)
byteLength方法计算一个指定字符串的字节数
Buffer.byteLength(string, [encoding])
在byteLength方法中,使用两个参数,其中第一个参数为必须输入参数,用于指定需要计算字节数的字符串,第二个参数为可选参数,用于指定按什么编码方式来计算字节数,默认值为utf8。
concat方法用于将几个Buffer对象结合创建为一个新的Buffer对象
Buffer.concat(list,[totalLength])
在concat方法中,使用两个参数,其中第一个参数为必须指定的参数,参数值为一个存放了多个Buffer对象的数组,concat方法将把其中的所有Buffer对象联结创建为一个Buffer对象;第二个参数为可选参数,用于指定被创建的Buffer对象的总长度,当省略该参数时,被创建的Buffer对象为第一个参数数组中所有Buffer对象的长度的合计值。
isEncoding方法用于检测一个字符串是否为一个有效的编码格式字符串
Buffer.isEncoding(encoding)