buffer
对象
1. 什么是buffer
在客户端 Javascript
脚本代码中,对于二进制数据没有提供一个很好的支持。然而,在处理TCP流或文件流时,必须要处理二进制数据。因此,在Node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区。
简单来说,Buffer
对象就是为了处理TCP数据流
(暂且不表)和文件
,比如读取一个txt
文件,一张jpeg
格式的图片,或者是一个word
文档,都可以。
2. 创建buffer
对象
- 直接使用
new
关键字来创建该类的实例对象
var buf = new Buffer()
3. Buffer
类拥有三种形式的构造函数
3.1 将缓存区大小(以字节为单位)指定为构造函数的参数
3.1.1 Buffer
的length
属性
- 被创建的
Buffer
对象拥有一个length
属性,这个属性值就是创建的Buffer
对象的缓存区大小
var buf = new Buffer(100);console.log(buf);console.log(buf.length);// result100
3.1.2 初始化创建的Buffer
对象
- 此时创建的
buf
对象,没有被初始化,换句话说,就是每次console.log(buf)
的结果都是不一样的,但是这个buf
对象的length
属性是固定的100
// 再次console.log(buf),输出的结果与上面的不一样
- 使用
Buffer
对象的fill
方法来初始化缓存区中的内容
buf.fill(val, [offset], [end])
-
第一个参数为必填的
Buffer
对象的填充值,填充值均以16进制
计算- 一般
val
参数的值为0
- 如果
val
参数为数值,填充的结果就是参数val
- 如果
val
参数为数组或对象,填充的结果全部为0
- 如果
val
参数为true
,填充的结果全部为1
- 如果
val
参数为false
,填充的结果全部为0
- 如果
val
参数为字符串,填充的结果全部为,每个字符串中的字符所对应的ascii
表中的值,并且每个字符依次在length
值内循环
- 一般
-
第二个参数和第三个参数可选
-
offset
表示为起始位置写入,默认为0
-
end
表示将数值写入到第几个字节处,默认为length
的值
-
3.2 直接使用一个数组来初始化缓存区
var buf = new Buffer(['a', 'b', 'c']);console.log(buf)// result
3.3 直接使用一个字符串来初始化缓存区
var buf = new Buffer(str, [encoding])
- 第一个参数
str
为初始化缓存区的字符串,第二个参数encoding
用于指定文字编码格式的字符串,默认为utf8
- 不同编码格式输出结果
var ascii = new Buffer('aLittleTea一点点', 'ascii');console.log('ascii ', ascii);// result// asciivar utf8 = new Buffer('aLittleTea一点点', 'utf8');console.log('utf8 ', utf8);// result// utf8 var utf16le = new Buffer('aLittleTea一点点', 'utf16le');console.log('utf16le', utf16le);// result// utf16le var ucs2 = new Buffer('aLittleTea一点点', 'ucs2');console.log('ucs2 ', ucs2);// result// ucs2 var base64 = new Buffer('aLittleTea一点点', 'base64');console.log('base64 ', base64);// result// base64 var binary = new Buffer('aLittleTea一点点', 'binary');console.log('binary ', binary);// result// binary var hex = new Buffer('aLittleTea', 'hex');console.log('hex ', hex);// result// hex
4. 字符串的长度与缓存区的长度
在Node.js中,一个字符串的长度与根据该字符串所创建的缓存区的长度并不相同。因为在计算字符串的长度时,以位子作为一个单位,而在计算缓存区的长度时,以字节作为一个单位。 一个汉字字符串的长度为1,但是一个汉字在Buffer
缓存区中字节的长度为3,换句话说,在Node.js的Buffer
类中,一个汉字的字节长度为3
var chinese = '一点点奶茶有点儿好喝';var buf = new Buffer(chinese);console.log(buf);// result//console.log(chinese.length); // 10console.log(buf.length); // 30console.log(chinese[4]); // 茶console.log(buf[4]); // 130 注:在buf中编码为16进制,输出的结果是10进制 // 修改chinese的某一个字符chinese[4] = '昔';// 字符串对象一旦被创建,就不可以被修改console.log(chinese); // 一点点奶茶有点儿好喝// 修改buf的某一个字节buf[0] = 'e4';buf[1] = 'ba';buf[2] = '8c';console.log(buf)// // 被修改的前三个字节全都是00