美文网首页
10-NodeJS核心API-Buffer对象

10-NodeJS核心API-Buffer对象

作者: 仰望_IT | 来源:发表于2020-03-24 22:09 被阅读0次

    0.准备知识

    0.1计算机只能识别0和1(因为计算机只认识通电和断电两种状态),
    0.2所有存储在计算机上的数据都是0和1组成的(数据越大0和1就越多)
    0.3计算机中的度量单位

    1 B(Byte字节) = 8 bit(位)
    00000000 就是一个字节
    111111111 也是一个字节
    10101010 也是一个字节
    任意8个 0或1的组合都是一个字节
    1 KB = 1024 B
    1 MB = 1024KB
    1 GB = 1024MB

    1.什么是Buffer?

    中文文档

    Buffer是NodeJS全局对象上的一个类, 是一个专门用于存储字节数据的类, 用于直接处理二进制数据
    NodeJS提供了操作计算机底层API, 而计算机底层只能识别0和1, 所以就提供了一个专门用于存储字节数据的类

    2.如何创建一个Buffer对象

    2.1创建一个指定大小的Buffer

    Buffer.alloc(size[, fill[, encoding]])
    size Buffer 的所需长度。
    fill用于预填充 Buffer 的值。默认值: 0
    encoding 如果 fill 是一个字符串,则这是它的字符编码。默认值: 'utf8'

    创建一个大小为 size 字节的新 Buffer。 如果 fill 为 undefined,则用零填充 Buffer。

    let buf = Buffer.alloc(5);
    console.log(buf);  // <Buffer 00 00 00 00 00>
    

    如果指定了 fill, 则用指定的值来填充
    【注意】通过console.log();来输出Buffer会自动将存储的内容转为16进制再输出
    比如这里的17的十六进制是11

    let buf = Buffer.alloc(5, 17);
    console.log(buf);   // <Buffer 11 11 11 11 11>
    

    2.2根据数组/字符串创建一个Buffer对象

    Buffer.from(string[, encoding])
    会将数组/字符串中的数据转换为二进制存储到Buffer中
    abc分别对应的ASCII值是97, 98, 99转换为16进制就是61, 62, 63, 所以这里输出的是 <Buffer 61 62 63>
    ASCII码对照表

    let buf = Buffer.from("abc");
    console.log(buf);  // <Buffer 61 62 63>
    

    3.Buffer对象的本质

    本质就是一个数组

    let buf = Buffer.from("abc");
    console.dir(buf);   // Buffer(3) [Uint8Array] [ 97, 98, 99 ]
    

    可以通过索引操作Buffer

    let buf = Buffer.from([1, 3, 5]);
    console.log(buf);  // <Buffer 01 03 05>
    buf[0] = 6;
    console.log(buf);  // <Buffer 06 03 05>
    

    4.Buffer实例方法

    buf.toString([encoding[, start[, end]]])  将Buffer中的二进制数据转换成字符串
    encoding  使用的字符编码。默认值: 'utf8'
    start    开始解码的字节偏移量。默认值: 0
    end     结束解码的字节偏移量(不包含)。默认值: buf.length

    let buf = Buffer.from([97, 98, 99]);
    console.log(buf.toString());  // abc
    console.log(buf.toString("utf8", 1));   // bc
    console.log(buf.toString("utf8",1, 2));  // b
    

    buf.write(string[, offset[, length]][, encoding])  往Buffer中写入数据
    string  要写入 buf 的字符串。
    offset  开始写入string 之前要跳过的字节数。默认值: 0
    length  要写入的字节数。默认值: buf.length - offset(总字节数减去跳过的字节数)。
    encoding string 的字符编码。默认值: 'utf8'

    let buf = Buffer.alloc(5);
    console.log(buf);  // <Buffer 00 00 00 00 00>
    
    buf.wirte("abcdef");
    console.log(buf);  // <Buffer 61 62 63 64 65>
    [注]因为在创建Buffer的时候已经指定了5个字节, 所以这里只能放下abcde
    console.log(buf.toString());  // abcde
    
    buf.wirte("abcdef", 2);
    console.log(buf);  // <Buffer 00 00 61 62 63>
    console.log(buf.toString());  // abc
    
    buf.wirte("abcdef", 2, 2);
    console.log(buf);  // <Buffer 00 00 61 62 00>
    console.log(buf.toString());  // ab
    

    buf.slice([start[, end]])  从指定位置截取新Buffer
    start 新 Buffer 开始的位置。默认值: 0
    end   新 Buffer 结束的位置(不包含)。默认值: buf.length
    返回一个新的 Buffer,但是由 start 和 end 索引进行偏移和裁剪, 和JavaScript中字符串截取子串很像。

    let buf1 = Buffer.from("abcdef");
    let buf2 = buf1.slice(); // abcdef
    let buf2 = buf1.slice(2); // cdef
    let buf2 = buf1.slice(2, 4); // cd
    console.log(buf2.toString());
    

    buf.toJSON()  将Buffer实例转为JSON对象

    let buf = Buffer.from("abcdef");
    console.log(buf.toJSON());  // { type: 'Buffer', data: [ 97, 98, 99, 100, 101, 102 ] }
    
    // 将JSON转换为对象
    console.log(JSON.stringify(buf));   // {"type":"Buffer","data":[97,98,99,100,101,102]}
    // 将对象转为JSON
    let obj = JSON.stringify(buf);
    console.log(JSON.parse(obj));  // { type: 'Buffer', data: [ 97, 98, 99, 100, 101, 102 ] }
    

    5.Buffer静态方法

    Buffer.isEncoding(encoding)  检查是否支持某种编码格式

    let res1 = Buffer.isEncoding("utf8");
    console.log(res1);   // true
    let res2 = Buffer.isEncoding("gbk");
    console.log(res2);  // false
    

    Buffer.isBuffer(obj)  检查是否是Buffer类型对象

    let buf = Buffer.alloc(5);
    console.log(Buffer.isBuffer(buf));  // true
    let obj = {};
    console.log(Buffer.isBuffer(obj));  // false
    

    Buffer.byteLength(string[, encoding])  获取Buffer实际字节长度

    let buf1 = Buffer.from("123");
    console.log(Buffer.byteLength(buf1));   // 3
    

    【注意】: 一个汉字占用三个字节

    let buf2 = Buffer.from("字节");
    console.log(Buffer.byteLength(buf2));   // 6
    

    因为Buffer对象的本质是数组, 也可以用数组的length属性获取Buffer实际字节长度
    用这种方法比Buffer.byteLength方便

    let buf1 = Buffer.from("123");
    console.log(buf1.length);   // 3
    let buf2 = Buffer.from("字节");
    console.log(buf2.length);   // 6
    

    Buffer.concat(list[, totalLength])  合并 list 中所有 Buffer 实例

    let buf1 = Buffer.from("abc");
    let buf2 = Buffer.from("123");
    let buf3 = Buffer.from("def");
    let res = Buffer.concat([buf1, buf2, buf3]);
    console.log(res);   // <Buffer 61 62 63 31 32 33 64 65 66>
    console.log(res.toString());    // abc123def
    

    相关文章

      网友评论

          本文标题:10-NodeJS核心API-Buffer对象

          本文链接:https://www.haomeiwen.com/subject/nyznyhtx.html