1

Buffer对象与字符串

1. Buffer对象的toString()方法

  • Buffer对象中保存的数据转换为字符串
  • toString([encoding], [start], [end])
  • 第一个参数用于指定Buffer对象中保存的文字编码格式,默认参数值为utf8
  • 第二个参数和第三个参数用于指定被转换数据的起始位置与结束位置,不包含结束位置
var buf = new Buffer('BUFFER OBJECT');
console.log(buf);
console.log(buf.toString());
console.log(buf.toString('utf8', 2, 5));
// result
<Buffer 42 55 46 46 45 52 20 4f 42 4a 45 43 54>
BUFFER OBJECT
FFE

2. Buffer对象的write()方法

  • 向已经创建的Buffer对象中写入字符串
  • buf.write(string, [offset], [length], [encoding])
  • 第一个参数为指定需要写入的字符串
  • 第二个参数和第三个参数用于指定字符串转换为字节数据后的写入位置(包括起始值和结束值)
  • 第四个参数为编码格式,默认为utf8格式
var chinese = '一点点奶茶有点儿好喝';
var buf = new Buffer(chinese);
buf.write('二', 0, 3, 'utf8'); 
console.log(buf.toString());
// 二点点奶茶有点儿好喝
在这个03区间内,实质上对应的是chinese字符串内的这个字,如果把3改成6,得到的结果依然是二点点奶茶有点儿好喝,因为申请的空间大于所写入的空间,所以结果不变。
如果把buf.write('二', 0, 3, 'utf8')中的改为二二,同样给03区间,结果依然是二点点奶茶有点儿好喝,但是如果区间为06,那么结果就是二二点奶茶有点儿好喝
如果把buf.write('二', 0, 3, 'utf8')改成buf.write('二二点奶茶不是可口可乐', 0, 30, 'utf8') ,那么结果是二二点奶茶不是可口可,得到的buf的长度依然是30

所以,也就是说,bufwrite方法,只是把原buf的内容剪切掉,新内容如果刚好能放下,那么新内容将旧内容替换,如果不能刚好放下,那么从新内容的起始位置开始计算,能放多少就放多少,多余的部分舍去,不够的部分,将不替换旧内容。

说白了,就是buf字节长度所对应的内容的替换。

3. StringDecoder对象

使用StringDecoder对象将Buffer对象中的数据转换为字符串,该对象的作用与Buffer对象的toString方法的作用相同,但是对于utf8编码格式的字符串提供更好的支持
var StringDecoder =  require('string_decoder').StringDecoder;
var decoder = new StringDecoder('utf8');
var buf = new Buffer('新垣結衣が主役の映画');
console.log(decoder.write(buf));
// result
// 新垣結衣が主役の映画

4. Buffer对象与JSON对象的互相转换

  • JSON.stringify(buf)Buffer对象中保存的数据转换为一个字符串
var buf = new Buffer('一点点奶茶有点儿好喝');
console.log(buf);
// <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>
var jsonBuffer = JSON.stringify(buf);
console.log(jsonBuffer);
{
    "type": "Buffer",
    "data": [228,184,128,231,130,185,231,130,185,229,165,182,232,140,182,230,156,137,231,130,185,229,132,191,229,165,189,229,150,157]
}
var data = [228,184,128,231,130,185,231,130,185,229,165,182,232,140,182,230,156,137,231,130,185,229,132,191,229,165,189,229,150,157];
var newData = []
data.forEach(function(elem){
    newData.push(elem.toString(16))
})
console.log(newData)
// ['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']
  • 可以发现,对Buffer对象进行JSON.stringify()之后,得到的对象的data属性的属性值,转换成16进制之后,就是该Buffer对象的字节值

5. 复制缓存数据

  • buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])
  • 第一个参数用于指定复制的目标Buffer对象
  • 第二个参数用于指定目标Buffer对象中从第几个字节开始写入数据,默认值是0
  • 第三个参数用于指定复制源Buffer对象中获取数据时的开始位置,默认值是0
  • 第四个参数用于指定从复制源Buffer对象中获取数据时的结束位置,默认值是复制源Buffer对象的长度
var buf1 = new Buffer('新垣結衣が主役の映画「ミックス」が中国で公開へ');
console.log(buf1);
var buf2 = Buffer(256).fill(0);
console.log(buf2);
buf1.copy(buf2, 10, 12, 30);
console.log(buf2.toString());
/***
 * <Buffer e6 96 b0 e5 9e a3 e7 b5 90 e8 a1 a3 e3 81 8c e4 b8 bb e5 bd b9 e3 81 ae e6 98 a0 e7 94 bb e3 80 8c e3 83 9f e3 83 83 e3 82 af e3 82 b9 e3 80 8d e3 81 ... >
 * <Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... >
 *           が主役の映画                                                                                                                                         
 ***/

buf1有值,buf2想要复制buf1的值,那么就是buf1.copy(buf2, <buf2要被粘贴的起始位置>, <buf1要被复制的起始位置>, <buf1要被复制的结束位置>)

6. Buffer类的类方法

6.1 isBuffer方法
  • Buffer.isBuffer(buf)
  • 判断一个对象是否为一个Buffer对象,返回结果为true或者false
6.2 byteLength方法
  • Buffer.byteLength(string, [encoding])
  • 在不同的编码格式下,同一个字符的字节长度是不一样的
var japanese = '新垣結衣';
console.log(Buffer.byteLength(japanese, 'utf8'));   //12
console.log(Buffer.byteLength(japanese, 'utf16le'));//8
console.log(Buffer.byteLength(japanese, 'base64')); //3
console.log(Buffer.byteLength(japanese, 'hex'));    //2
console.log(Buffer.byteLength(japanese, 'ascii'));  //4
6.3. concat方法,拼接Buffer对象的值
  • 与字符串和数组的concat方法使用相同
var buf1 = new Buffer('新垣結衣が主役の映画');
var buf2 = new Buffer('「ミックス」');
var buf3 = new Buffer('が中国で公開へ');
console.log(Buffer.concat([buf1, buf2, buf3]).toString());
// result
// 新垣結衣が主役の映画「ミックス」が中国で公開へ
6.4. isEncoding方法
  • Buffer.isEncoding(encoding)
  • 检测一个字符串是否为一个有效的编码格式字符串
var code = 'utf8';
console.log(Buffer.isEncoding(code));

karuru
329 声望64 粉丝