美文网首页
Buffer缓冲器

Buffer缓冲器

作者: Leonard被注册了 | 来源:发表于2019-12-14 11:49 被阅读0次

    1.什么是Buffer

            缓冲区Buffer是暂时存放输入输出数据的一段内存,JS语言没有二进制数据类型,而当处理TCP和文件流时我们必须要处理二进制数据,因此Node为我们提供了一个Buffer对象对二进制数据进行操作。
            Buffer是一个标识固定内存分配的全局对象,也就是说要放到缓存区中的字节数需要提前确定好,它就好比由一个8位字节元素组成的数组,可以有效地在JS中表示二进制数据。

    2.定义Buffer的三种方式

    • 通过长度定义
      //表示分配一个长度为6个字节的Buffer
      //且会把所有的字节设置为0
      //可以提供默认值
      let buf1 = Buffer.alloc(6);
      let buf2 = Buffer.alloc(6,2);
      console.log(buf1);    // <Buffer 00 00 00 00 00   00>
      console.log(buf2);    // <Buffer 02 02 02 02 02 02>
      
      //分配一块没有初始化的内存
      let buf3 = Buffer.allocUnsafe(6);
      console.log(buf3);    // 出现6字节的随机数据
      
    • 通过字符串定义
      let buf4 = Buffer.from('哈哈');
      console.log(buf4);    // <Buffer e5 93 88 e5 93 88>
      
    • 通过数组定义
      let buf5 = Buffer.from([1,2,3]);
      console.log(buf5);    // <Buffer 01 02 03>
      

    3.常用方法

    1.buf.fill(value,offset,end,encoding)

    @params
    value:需要填充的内容
    offset:开始写入之前要跳过的字节数
    end:填充结束索引
    encoding:表示编码方式
    @return
    填充后的Buffer数据

    let buf6 = Buffer.alloc(6);
    buf6.fill(3,1,3);    
    console.log(buf6);    // [0,3,3,0]
    

    2.buf.write(value,offset,length,encoding)

    @params
    value:需要写入的字符串
    offset:开始写入之前要跳过的字节数
    length:写入的字节长度
    encoding:表示编码方式
    @return
    写入后的Buffer数据

    let buf7 = Buffer.alloc(6);
    buf7.write("哈哈",0,3,'utf8');
    console.log(buf7);      // <Buffer e5 93 88 00 00 00>
    console.log(buf7.toString());   // 哈
    

    3.buf.writeInt8(value,offset)

    @params
    value:需要写入的数值
    offset:开始写入之前要跳过的字节数
    @return
    写入后的Buffer数据

    let buf8 = Buffer.alloc(6);
    // 向指定的索引写入一个8位的整数,也就是说占用一个字节的整数
    buf8.writeInt8(0,0);
    buf8.writeInt8(16,1);
    buf8.writeInt8(32,2);
    console.log(buf8);    // <Buffer 00 10 20 00 00 00>
    
    let buf9 = Buffer.alloc(6);
    
    // Big Endian 高位在前
    buf9.writeInt16BE(2**8,0);
    console.log(buf9);  // <Buffer 01 00 00 00 00 00>
    console.log(buf9.readInt16BE(0));   // 256
    
    // Little Endian 低位在前
    buf9.writeInt16LE(2**8,2);
    console.log(buf9);  // <Buffer 01 00 00 01 00 00>
    console.log(buf9.readInt16LE(2));   // 256
    

    4.buf.slice(start,end)

    @params
    start:新Buffer开始的位置
    end:新Buffer结束的位置
    @return
    新的Buffer数据,它引用与原始的 Buffer 相同的内存

    let buf10 = Buffer.alloc(6,1);
    let buf11 = buf10.slice(2,6);
    console.log(buf11);  // <Buffer 01 01 01 01>
    buf11.fill(4);
    console.log(buf10);  // <Buffer 01 01 04 04 04 04>
    
    // 解决乱码问题
    let buf12 = Buffer.from('哈哈哈哈');
    let buf13 = buf12.slice(0,5);
    let buf14 = buf12.slice(5);
    console.log(buf13.toString());   // 哈�
    console.log(buf14.toString());   // �哈哈
    let {StringDecoder} = require('string_decoder');
    let sd = new StringDecoder();
    // write的时候会判断是不是一个字符
    // 如果是的话就输出,不是的话则缓存在对象内部,等下次write的时候会把前面缓存的字符加到第二次write的buffer上再进行判断
    console.log(sd.write(buf13));    // 哈
    console.log(sd.write(buf14));    // 哈哈哈
    

    5.Buffer.isBuffer(obj)

    @params
    obj:需要判断的对象
    @return
    如果obj是一个Buffer,则返回 true,否则返回 false。

    let obj1 = Buffer.alloc(6);
    let obj2 = [1,2,3];
    console.log(Buffer.isBuffer(obj1));     // true
    console.log(Buffer.isBuffer(obj2));     // false
    

    6.Buffer.byteLength(string, encoding)

    @params
    string:要计算长度的值
    encoding:编码方式
    @return
    string中包含的字节数

    console.log(Buffer.byteLength('哈哈','utf-8'));  // 6
    

    相关文章

      网友评论

          本文标题:Buffer缓冲器

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