buffer
对象buffer
在客户端
Javascript
脚本代码中,对于二进制数据没有提供一个很好的支持。然而,在处理TCP流或文件流时,必需要处理二进制数据。所以,在Node.js中,定义了一个Buffer类,该类用来建立一个专门存放二进制数据的缓存区。
简单来讲,Buffer
对象就是为了处理TCP数据流
(暂且不表)和文件
,好比读取一个txt
文件,一张jpeg
格式的图片,或者是一个word
文档,均可以。javascript
buffer
对象new
关键字来建立该类的实例对象var buf = new Buffer()
Buffer
类拥有三种形式的构造函数Buffer
的length
属性Buffer
对象拥有一个length
属性,这个属性值就是建立的Buffer
对象的缓存区大小var buf = new Buffer(100); console.log(buf); console.log(buf.length); // result <Buffer c8 eb 75 9d 93 00 00 00 01 00 00 00 01 00 00 00 04 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 28 6e 3e 23 b3 01 00 00 00 00 00 00 00 00 00 00 f8 65 ... > 100
Buffer
对象buf
对象,没有被初始化,换句话说,就是每次console.log(buf)
的结果都是不同的,可是这个buf
对象的length
属性是固定的100
<Buffer a8 ed 1d dc 45 00 00 00 01 00 00 00 01 00 00 00 04 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 98 53 67 75 90 01 00 00 00 00 00 00 00 00 00 00 68 4b ... > // 再次console.log(buf),输出的结果与上面的不同 <Buffer 78 ec cf e7 62 00 00 00 01 00 00 00 01 00 00 00 04 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 f8 50 58 d9 fc 01 00 00 00 00 00 00 00 00 00 00 c8 48 ... >
Buffer
对象的fill
方法来初始化缓存区中的内容buf.fill(val, [offset], [end])
第一个参数为必填的Buffer
对象的填充值,填充值均以16进制
计算java
val
参数的值为0
val
参数为数值,填充的结果就是参数val
val
参数为数组或对象,填充的结果所有为0
val
参数为true
,填充的结果所有为1
val
参数为false
,填充的结果所有为0
val
参数为字符串,填充的结果所有为,每一个字符串中的字符所对应的ascii
表中的值,而且每一个字符依次在length
值内循环第二个参数和第三个参数可选数组
offset
表示为起始位置写入,默认为0
end
表示将数值写入到第几个字节处,默认为length
的值var buf = new Buffer(['a', 'b', 'c']); console.log(buf) // result <Buffer 00 00 00>
var buf = new Buffer(str, [encoding])
str
为初始化缓存区的字符串,第二个参数encoding
用于指定文字编码格式的字符串,默认为utf8
var ascii = new Buffer('aLittleTea一点点', 'ascii'); console.log('ascii ', ascii); // result // ascii <Buffer 61 4c 69 74 74 6c 65 54 65 61 00 b9 b9> var utf8 = new Buffer('aLittleTea一点点', 'utf8'); console.log('utf8 ', utf8); // result // utf8 <Buffer 61 4c 69 74 74 6c 65 54 65 61 e4 b8 80 e7 82 b9 e7 82 b9> var utf16le = new Buffer('aLittleTea一点点', 'utf16le'); console.log('utf16le', utf16le); // result // utf16le <Buffer 61 00 4c 00 69 00 74 00 74 00 6c 00 65 00 54 00 65 00 61 00 00 4e b9 70 b9 70> var ucs2 = new Buffer('aLittleTea一点点', 'ucs2'); console.log('ucs2 ', ucs2); // result // ucs2 <Buffer 61 00 4c 00 69 00 74 00 74 00 6c 00 65 00 54 00 65 00 61 00 00 4e b9 70 b9 70> var base64 = new Buffer('aLittleTea一点点', 'base64'); console.log('base64 ', base64); // result // base64 <Buffer 68 b8 ad b6 57 93 79 af> var binary = new Buffer('aLittleTea一点点', 'binary'); console.log('binary ', binary); // result // binary <Buffer 61 4c 69 74 74 6c 65 54 65 61 00 b9 b9> var hex = new Buffer('aLittleTea', 'hex'); console.log('hex ', hex); // result // hex <Buffer >
在Node.js中,一个字符串的长度与根据该字符串所建立的缓存区的长度并不相同。由于在计算字符串的长度时,以位子做为一个单位,而在计算缓存区的长度时,以字节做为一个单位。
一个汉字字符串的长度为1,可是一个汉字在Buffer
缓存区中字节的长度为3,换句话说,在Node.js的Buffer
类中,一个汉字的字节长度为3
var chinese = '一点点奶茶有点儿好喝'; var buf = new Buffer(chinese); console.log(buf); // result // <Buffer e4 b8 80 e7 82 b9 e7 82 b9 e5 a5 b6 e8 8c b6 e6 9c 89 e7 82 b9 e5 84 bf e5 a5 bd e5 96 9d> console.log(chinese.length); // 10 console.log(buf.length); // 30 console.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) // <Buffer 00 00 00 e7 82 b9 e7 82 b9 e5 a5 b6 e8 8c b6 e6 9c 89 e7 82 b9 e5 84 bf e5 a5 bd e5 96 9d> // 被修改的前三个字节全都是00