Node.js API实例讲解——创建Buffer实例
创建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 的字节。