创建Buffer实例

node.js 提供了几种方式来创建Buffer实例。

new Buffer(size)

参数size定义了数组大小,Buffer长度是不可变的。

注意:new Buffer(size) 时,并非“一定会”创建一个内容为“空”的对象,可以借助 buf.fill()测底清空。

测试

 var buf1 = new Buffer(3);
 console.log(buf1);   // 打印类似// 并不一定等于下面,所以不要依赖new Buffer(size)方式创建"空"Buffer
 buf1.fill()
 console.log(buf1);   //

测试2.

 var buf = new Buffer(5);      // 设置Buffer长度为5
 console.log(buf.length);      // 长度为5
 buf.write("hello world");     // 11个字符
 console.log(buf.toString());  // 只打印 hello,因Buffer长度固定为5
 console.log(buf.length);      // 打印5,说明长度没变。

new Buffer(array)

要求是octet数组,也就是btye数组。

一个btye是八位bit,简单的说就是 从 0 ~ 255

测试1.sex

 var buf = new Buffer([0,2,42,255]);
 console.log(buf[3])  // 打印出255

测试2 当超出0~255范围时,内部会求256的余数。

 var buf = new Buffer([12,257,258,259]);
 console.log(buf[1]); // 打印 1
 console.log(buf[2]); // 打印 2
 console.log(buf[3]); // 打印 3

等价于

 console.log(257%256); // 打印 1
 console.log(258%256); // 打印 2
 console.log(259%256); // 打印 3

测试3 当数组是浮点数,会取整。

 var buf = new Buffer([12,22.4,23.5,24.6]);
 console.log(buf[1]); // 打印 22
 console.log(buf[2]); // 打印 23
 console.log(buf[3]); // 打印 24

测试4 当数组的值是字符串,如果这个值是数字形式会当作数字,否则会当作0。

 var buf = new Buffer([12,"a","9a","9"]);
 console.log(buf[1]); // 打印 0
 console.log(buf[2]); // 打印 0
 console.log(buf[3]); // 打印 9

new Buffer(str, [encoding])

可以通过字符串创建一个Buffer实例,第二个参数表示字符编码方式(可选)。

Buffer支持的编码:

'ascii'编码,只为7位的ASCII的数据。这个编码方法非常快!

'utf8' 编码,支持Unicode字符。

'utf16le' 编码,小端编码的Unicode字符。对(u10000 ~ u10FFFF)支持。

'ucs2' 是 'utf16le' 编码的别名。

'base64' 是 Base64字符串编码。

'hex' 表示十六进制编码,每个byte编码为两个十六进制字符。

测试1,不指定编码方式,默认是utf8编码。

 var buf = new Buffer("世界你好"); // 默认utf8编码
 console.log(buf.toString());  // 打印出 "世界你好"

测试2,用编码'ascii'创建Buffer实例。如果应用都英文,采用ascii编码会很快速。

 var buf = new Buffer("世界你好","ascii"); // 默认utf8编码
 console.log(buf.toString());  // 打印出乱码,因为中文不在ascii编码集内。
 var buf2 = new Buffer("hello world","ascii");
 console.log(buf2.toString()) // 打印出"hello world"

测试2,用编码ucs2也就是utf16le编码创建Buffer实例。我们会发现buf.length不是2而是4,这个原因是utf16le编码表示一个字符要用2个btye。

 var buf = new Buffer("你好","utf16le"); // 使用utf16le编码
 console.log(buf.toString("ucs2"));  // 打印“你好”
 console.log(buf.length)    // 打印出 4
 var buf2 = new Buffer("ab","utf16le"); // 使用utf16le编码
 console.log(buf2.toString("ucs2"));  // 打印“ab”
 console.log(buf2.length)    // 打印出 4

测试3,用默认编码utf8创建Buffer实例。我们会发现buf.length和buf2.length的长度不同,这个原因是因为utf8编码可以智能的转换编码方式。

utf8表示一个中文字符需要3个byte,而utf16le只需要2个byte,而utf8表示一个英文字母只需1个byte,而utf16le还是需要2个byte。所以,各有优缺点,在实际应用中灵活选择编码方式。

如果中英文混合字符串那么统一采用utf8比较省空间,绝大多数都是中文的情况采用ucs2(utf16le)编码比较省空间。

 var buf = new Buffer("ab"); // 使用默认的utf8编码
 console.log(buf.length)    // 打印出 2

 var buf = new Buffer("你好");
 console.log(buf2.length);   // 打印出 6

测试4,hex编码字符串。

 var buf = new Buffer("你好");
 console.log(buf.length);           // 打印6,也就是6个byte。
 var hexstr = buf.toString("hex");  // HEX编码把每个byte编译为两个十六进制字符。
 console.log(hexstr);               // 打印出 e4bda0e5a5bd,是hex编码后的值。

 console.log(hexstr.length);        // 打印出 12
 // 以下是把hex编码字符串转换为UTF8字符串。
 var buf2 = new Buffer(hexstr,"hex");  // 通过hex编码创建一个新Buffer实例。
 console.log(buf2.toString());     // 打印 ”你好“

buf.slice([start], [end])

创建Buffer对象,还可以slice方法从已有Buffer对象划分出新的Buffer对象。

start[可选]参数,表示截取的起始位置,默认 0。

wend[可选]参数,表示截取的结束位置,默认buf.length 。

测试1,不带任何参数。

 var buf1 = new Buffer("你好"); 
 var buf2 = buf1.slice();
 console.log(buf2.toString())  // 打印“你好”,说明截取了全部buf1的字节。

测试2,带参数。

 var buf1 = new Buffer("你好"); 
 var buf2 = buf1.slice(3);     // 从buf1的3位置开始截取
 console.log(buf2.toString())  // 打印“好”,说明截取了全部buf1 3~6的字节。

 var buf3 = new Buffer("世界你好"); 
 var buf4 = buf3.slice(3,9);
 console.log(buf4.toString())  // 打印“界你”,截取了全部buf3 3~9 的字节。
本节主要讲解了 创建Buffer对象的各种方法。