• Node.js系列:Buffer类的使用


    客户端JavaScript中没有对二进制数据提供很好的支持。但是在处理TCP流或文件流时,必须要处理二进制数据。Node.js定义了一个Buffer类,用来创建一个专门存放二进制数据的缓存区。
    Buffer中存的数据默认为16进制。
    1、创建Buffer对象
    在Node.js中,Buffer类是一个可以在任何模块中不使用的全局类,不要单独加载。可以使用New关键字来创建该类的实例对象。
    Buffer类有三种形式的构造函数:
    第一种:将缓存区大小(以字节为单位)作为构造函数的参数
    var size = 128; //缓存区大小单位字节
    var buf = new Buffer(size);
    此时被创建的Buffer对象有一个length属性,属性值为缓存区大小。
    console.log(size); //128
    可以使用Buffer对象的fill()函数来初始化缓存区中的所有内容:
    buf.fill(value,[offset],[end]);
    ps:
    value 必须参数,参数值是需要被写入的数值。
    [offset] 可选参数,默认为0,用于指定从第几个字节处开始写入被指定的数值
    [end] 可选参数,用于指定数值一直写入到第几个字节处,默认值为Buffer对象的最大值
    例子:
    1、声明缓存区实例,并在第10个字节的位置输入1,直到末尾。
    2、在第20~30字节之间,写入2
    buf = new Buffer(128);
    buf.fill(1,10);
    buff.fill(2,20,30);
     
    第二种:直接使用一个数组来初始化缓存区。
    var buf = new Buffer(Array);
    这种形式的构造函数中,使用了一个存放需要被指定数值的数组来作为构造函数的参数。
    var arr = [1,2,3];
    var buf = new Buffer(arr);
    console.log(buf); //
     
    第三种:直接使用一个字符串来初始化缓存区。
    var str = "你好";
    var buf = new Buffer(str,[encoding]);
    ps:
    str:必须参数,参数值用于初始化缓存区,
    [encoding]:可选参数,用于指定字符串文字编码格式,默认为"utf8"
    Node.js中可以使用的编码:
    ascii : ASCII字符串
    utf8 : UTF-8字符串
    utf16le : UTF-16LE字符串
    usc2 : USC2字符串
    base64 : 经过BASE64编码后的字符串
    binary : 二进制数据(不推荐使用)
    hex : 使用十六进制数值表示的字符串
     
    2、字符串的长度与缓存区的长度
    Node.js中,一个字符串长度与根据该字符串创建的缓存区的长度并不相同。计算字符串长度时,以文字作为单位;计算缓存区长度时,以字节作为单位。
     
    Buffer对象用slice()函数取出指定位置处的数据,该方法的使用与string对象的slice方法相同。slice()函数并不是复制缓存区的数据而是共享数据,因此,一旦修改了slice()函数取出的数据,则缓存区中保存的数据也将被修改。
     
    3、Buffer对象与字符串对象之间的相互转换
    Buffer 对象的toString方法可以将Buffer对象中保存的数据转换为字符串:
    var str = "我喜爱编程";
    var buf = new Buffer(str);
    buf.toString([encoding],[start],[end]);
    [encoding]:指定Buffer对象中保存的文字编码格式,默认值为utf8;
    [start]:指定被转换数据的起始位置,以字节为单位
    [end]:指定被转换数据的终止位置,以字节为单位
    实例:
    var str = "我喜爱编程";
    var buf = new Buffer(str);
    buf.toString("utf8",9,12); //编
    buf.toString("utf8",12,buf.length); //程
     
    Buffer对象的write方法,用于向已经创建的Buffer对象中写入字符串。
    var str = "我喜爱编程";
    var buf = new Buffer(str);
    buf.write(string,[offset],[length],[encoding]);
    string:必须参数,用于指定需要写入的字符串
    [offset]:指定字符串转换位字节数据后的写入位置
    [length]:指定字符串转换位字节数据后的写入位置
    [encoding]:指定写入字符串时使用的编码格式,默认为utf8;
    字节数据的书写位置从第1+offset个字节开始,到offset+length为止。
    var str = "我喜爱编程";
    var buf = new Buffer(str);
    buf.write("热",3,3); //3
    buf.toString(); //我热爱编程
     
    StringDecoder对象,可以将Buffer对象中的数据转换为字符串,该对象的作用与Buffer对象的toString()函数的作用相同,但是对于utf8编码格式的字符串提供更好的支持。在使用StringDecoder对象时,首先需要加载Node.js中的string_decoder模块。
    加载模块
    varstringDecoder=require("string_decoder").StringDecoder;
    实例化对象
    var decoder = new StringDecoder([encoding]);
    使用该对象的write()函数可以将Buffer对象中的数据转换位字符串
    decoder.write(buffer);
     
    4、Buffer对象与JSON对象之间的相互转换
    Node.js中,可以使用JSON.stringify()方法将Buffer对象中保存的数据转换为一个字符串,也可以使用JSON.parse()方法将一个经过转换后的字符串还原为一个数组。
    var str = "我喜爱编程";
    var buf = new Buffer(str);
    var json = JSON.stringify(buf);
    var parseArr = JSON.parse(json);
    var copy = new Buffer(parseArr);
    console.log(copy.toString()); //我喜爱编程
     
    5、复制缓存数据
    当需要将Buffer对象中保存的数据复制到另一个Buffer对象中时,可以使用Buffer对象的copy方法。
    var str = "我喜爱编程";
    var buf = new Buffer(str);
    buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd]);
    targetBuffer:必选参数,用于指定复制的目标Buffer对象
    [targetStart]:可选参数,用于指定从目标Buffer对象中从第几个字节开始写入数据,默认值为0
    [sourceStart]:可选参数,指定从复制源Buffer对象中获取数据时的开始位置,默认0
    [sourceEnd]:可选参数,指定从复制源Buffer对象中获取数据的结束位置,默认为复制Buffer对象的长度
    var buf_a = Buffer("我喜爱编程");
    var buf_b = Buffer(128);
    buf_b.fill(0);
    buf_a.copy(buf_b,10);
     
    6、Buffer类的类方法
    Node.js为Buffer类定义了三个类方法:
    isBuffer(),用于判断一个对象是否为一个Buffer对象
    语法:Buffer.isbuffer(obj);obj参数用于指定需要被判断的对象,如果对象为Buffer对象,方法返回true,否则返回false
    var a = "aaa";
    var b = Buffer(10);
    Buffer.isBuffer(a);
    Buffer.isBuffer(b);
     
    byteLength(),用来计算一个指定字符串的字节数
    语法:Buffer.byteLength(string,[encoding]);
    string:必须参数,用于指定计算字节数的字符串
    [encoding]:可选参数,用于指定按什么编码方式来计算字节数,默认utf8;
     
    concat(),将几个Buffer对象结合创建为一个新的Buffer对象。
    语法:Buffer.concat(list,[totalLength]);
    list:必须参数,参数值为一个存放了多个Buffer对象的数组;
    totalLength:可选参数,用于指定被创建的Buffer对象的总长度,当省略该参数时,被创建的Buffer对象为第一个参数数组中所有Buffer对象的长度的合计值。
    如果第一个参数为空数组,或第二个参数等于0,那么concat方法返回一个长度为0的Buffer对象。
    如果第一个参数数组中只有一个Buffer对象,那么concat方法直接返回该Buffer对象。
    如果第一个参数值数值中拥有一个以上的Buffer对象,那么concat方法返回被创建的Buffer对象。
     
    isEncoding(),用于检测一个字符串是否为一个有效的编码格式字符串;
    语法:Buffer.isEncoding(encoding);
    str1 = "utf16le";
    Buffer.isEncoding(str1); //true
    技术交流群:821039247
  • 相关阅读:
    mysql分表分库 ,读写分离
    二级域名解析设置及Apache 子域名配置
    PHP错误检测
    PHP缓存技术相关
    高并发一些处理办法
    memcached 安装与简单实用使用
    数据库入门
    函数
    结构体 枚举
    c# 6大类集合
  • 原文地址:https://www.cnblogs.com/humaotegong/p/6339685.html
Copyright © 2020-2023  润新知