Buffer的静态方法

Buffer.isEncoding(编码方式);

这个方法是判断编码方式是否被支持,return true/false

前面章节我们知道了 node.js 支持的编码方式。下面做几个例子。

例1 this

 console.log(Buffer.isEncoding("gb2312"));    // 打印 false 。 即使gb2312是编码方式,但不被node.js支持
 console.log(Buffer.isEncoding("utf8"));      // true
 console.log(Buffer.isEncoding("ucs2"));      // true
 console.log(Buffer.isEncoding("utf16le"));   // true
 console.log(Buffer.isEncoding("ascii"));     // true
 console.log(Buffer.isEncoding("base64"));    // true
 console.log(Buffer.isEncoding("hex"));       // true

Buffer.isBuffer(obj)判断是否obj是Buffer类型对象

例1fuck

 var o1 = "",o2 = new Buffer(1);
 console.log(Buffer.isBuffer(o1));  // false
 console.log(Buffer.isBuffer(o2));  // true

Buffer.byteLength(string, [encoding]) 获得特定编码下一个字符串所占用btye的数量。

这里可能会产生一个误解;得到的是占用的bytes数而不是字符数量。

还应注意的是,字符串与编码应该是正确的对应关系,比如中文用 ascii 编码方式,显然得不到正确的 byteLength;而base64和hex的编码也要输入对应的字符串形式。

[encoding] 是可选参数,默认 utf8

例1 

 var str = "你好";
 var buf = new Buffer(str);
 console.log(Buffer.byteLength(str));   // 6
 var hexStr = buf.toString("hex");      // 转换为 hex编码形式
 console.log(hexStr);                   // e4bda0e5a5bd 
 console.log(Buffer.byteLength(hexStr,"hex"));    // 6

这个例子我们会发现 utf8、hex、base64 编码只要原始字符串一致,那么占用的byte数量就一致,这个说明,hex和base64会先转换为utf8。

例2,ucs2与utf8占用的byte length是不相同的。

 var str = "你好";
 var buf = new Buffer(str);
 console.log(Buffer.byteLength(str,"utf8"));   // 6
 console.log(Buffer.byteLength(str,"ucs2"));   // 4

Buffer.concat(list, [totalLength]) 合并多个buffer对象,并返回一个新的buffer对象。

list 是一个数组,数组值必须是Buffer对象。

totalLength[可选] 指定合并后buffer对象的总长。

如果 list只有一个buffer,直接返回这个buffer对象,并且totalLength参数失效。

如果 list有多个buffer,会重新创建一个新的buffer对象。

sexlist有多个buffer情况下,如果不指定totalLength,那么会循环多个buffer得到其长度,这增加了多余的计算。所以明确指定totalLength更快。

下面的例子很重要,讲解了各种的使用情况。

 var tb;
 // list有一个Buffer对象,total会失效。
 tb = Buffer.concat([new Buffer(10)],20)
 console.log(tb.length);   // 10

 // list有多个Buffer对象,不指定totalLength
 tb = Buffer.concat([ new Buffer(10) , new Buffer(5) ]);
 console.log(tb.length);   // 15

 // list有多个Buffer对象,指定totalLength
 tb = Buffer.concat([ new Buffer(10) , new Buffer(5) ], 20);
 console.log(tb.length);   // 20

 // list有多个Buffer对象,指定totalLength
 // list内的Buffer对象总和的byte length > totalLength
 // 这种情况下,新合并的tb长度等于totalLength
 tb = Buffer.concat([ new Buffer(10) , new Buffer(222) ], 20);
 console.log(tb.length);   // 20

 // 如果多个buffer合并,list的第一个 buffer.length >= totalLength
 // 这种情况下就会抛出异常
 try{
 tb = Buffer.concat([ new Buffer(20) , new Buffer(222) ], 20);
 console.log(tb.length);  
 }catch(e){
  console.log("第一个buffer.length >= totalLength");
 }