站长杂谈 > web前端
web前端web前端

NodeJs的用法—Buffer缓存区

1.1    Buffer基本概念
JavaScript 语言自身没有二进制数据类型。二进制可以存储电脑中任何数据(比如:一段文本、一张图片、一个硬盘,应该说电脑中所有的数据都是二进制。)
NodeJs是服务端在处理像TCP(网络)流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。

1.2    Buffer创建
Buffer 对象可以通过多种方式来创建。
 
//Buffer类类似于一个数组,但是必须在创建的时候就确定长度。
//Buffer length长度单位为字节。 所以注意,该长度并不是文本的长度,而且文本存储在内存中字节数。 比如:“我”字符串长度为1,(默认编码方式为utf-8)内存中3个字节,如果是其他编码方式,占的字节数可能不同,一般占2-4个字节。
 
1.2.1 方法 1
创建长度为 10 字节的 Buffer 实例:
 
//Buffer创建,并且指定buffer的长度
var buf1 = new Buffer(10);


1.2.2 方法 2
通过给定的数组创建 Buffer 实例:
 
//给定“数据数组”创建 Buffer 实例
var buf2 = new Buffer([97,98,99]);
 
1.2.3 方法 3
通过一个字符串来创建 Buffer 实例:
 
//Buffer length长度单位为字节。 所以注意,该长度并不是文本的长度,而且文本存储在内存中字节数。 比如:“我”字符串长度为1,内存中3个字节。指定了编码为utf-8,如果是其他的编码,可能占的字节数不同。
var buf = new Buffer("你","utf-8");
console.log(buf.length);
 
 
utf-8 是默认的编码方式,此外它同样支持以下编码:"ascii", "utf8", "utf16le", "ucs2", "base64" 和 "hex"。
 
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。
 
1.3    Buffer写入内容

语法
buf.write(string[, offset[, length]][, encoding])
 
参数
参数描述如下:
    string - 写入缓冲区的字符串。
    offset - 缓冲区开始写入的索引值,默认为 0 。
    length - 写入的字节数,默认为 buffer.length
    encoding - 使用的编码。默认为 'utf8' 。
 
返回值
返回实际写入的大小。如果 buffer 空间不足, 则只会写入部分字符串。
 
实例:
 
//写入内容到buffer中。
var buf = new Buffer(20);

//write:写,从buffer的0位置开始。
/**
 string - 写入缓冲区的字符串。
 offset - 缓冲区开始写入的索引值,默认为 0,从缓冲区的哪个位置开始写入 。
 length - 写入的字节数,默认为 buffer.length
 encoding - 使用的编码。默认为 'utf8' 。
 */

buf.write("灰太狼真牛逼",0,15);//在默认编码utf-8下,每个中文占3个字节。从0开始写入,写入的长度是15,所以显示“灰太狼真牛”5个字
buf.write("abc",18);//从索引为18开始写入,总长度是20,所以只能再写入2个字节
console.log(buf.toString());

 
1.4    Buffer读取内容(转换为字符串)
语法:
读取 Node 缓冲区数据的语法如下所示:
 buf.toString([encoding[, start[, end]]])
 
参数:
参数描述如下:
    encoding - 使用的编码。默认为 'utf8' 。
    start - 指定开始读取的索引位置,默认为 0。
    end - 结束位置,默认为缓冲区的末尾。
 
返回值:
解码缓冲区数据并使用指定的编码返回字符串。
 
例1:
 

buf.write("灰太狼真牛逼",0,15);//在默认编码utf-8下,每个中文占3个字节。从0开始写入,写入的长度是15,所以显示“灰太狼真牛”5个字
buf.write("abc",18);//从索引为18开始写入,总长度是20,所以只能再写入2个字节
console.log(buf.toString("utf-8",3,6));//从第三个位置开始读取,结束位置是6,正好是第二个字“太”,注意这里的6不是长度为6,而是结束位置的索引。
 
例2:
 
var buf = new Buffer([97,98,99]);
for(var i=0;i<buf.length;i++)
{
    var c=buf.toString("utf8",i,i+1);
    //var c=buf.readUInt8(i);
   
console.log(c);
}
 
1.5    Buffer拷贝

拷贝一个Buffer的某一段到操作对象中。
 
语法
 
buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
 
参数
参数描述如下:
    targetBuffer - 最终要放数据的缓冲区
    targetStart - 数字, 可选, 默认: 0,从目标缓冲区的哪个位置开始放置。
    sourceStart - 数字, 可选, 默认: 0,从源缓冲区的哪个位置开始拷贝。
    sourceEnd - 数字, 可选, 默认: 到源缓冲区的哪个位置结束拷贝。如果不指定,默认拷贝到结束。
 
 
例1:
 
 
//需求:拷贝“灰太狼真牛逼”中的前面两个字“灰太”到新的缓冲区,并输出到控制台

var oldbuf = new Buffer(20);//旧的缓冲区
var newbuffer = new Buffer(6);//新的缓冲区
oldbuf.write("灰太狼真牛逼",0,18);//旧的缓冲区写入内容
oldbuf.copy(newbuffer,0,0,6);//拷贝内容到新的缓冲区
console.log(newbuffer.toString());//测试拷贝结果
 
 
例2:Buffer解析为json对象
 
var buf = new Buffer('{"name":"白素贞","sex":"女"}');
//buffer解析为json.
var jsonobj=JSON.parse(buf);
console.log(jsonobj.name,jsonobj.sex);
 
 

web前端ruitiancnweb前端z_vae@sina.com

web前端