• Node.js学习二 —— 缓冲区


    缓冲区

    利用缓冲区处理、编码、解码二进制数据

    创建缓冲区

    使用字符串创建:

    var buf = new Buffer('Hello World');
    
    • 1

    如果需要指定编码格式,则添加第二个参数如base64表明即可。

    可以被接受的编码格式(注意大小写下不同的写法):

    • ascii——ASCII:该编码格式仅适用于ASCI字符集。
    • utf8——UTF-8:这是一种变宽度的编码格式,可以表示Unicode字符集中的任意字符,它是网络上的首选编码格式。在你没有指定编码格式参数的情况下,8是默认的编码格式。
    • base64——Base64:这种编码格式基于64个可打印的ASCI字符来表示二进制数据, Bse64通常用于在字符文档内嵌入可以被转换成字符串的二进制数据,在需要时又可以完整无损地转换回原来的二进制格式。

    如果没有初始化内容,可以指定大小:

    var buf = new Buffer(1024); // 创建长度为1024个字节的缓冲区
    
    • 1

    在缓冲区中获取和设置数据

    创建之后,可以查看和修改:

    var buf = new Buffer("my buffer content");
    // 像数组一样读取
    console.log(buf[10]);
    // 同样也可以修改
    buf[5] = 123;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意,当创建一个用长度初始化的缓冲区时,里面默认的数据并不是0,而是一些随机值

    注意:在某些情况下不会出错。如:

    1. 如果将缓冲区中的某个位置设置为一个大于255的数,那么将会用256对该数取模,最终将取模结果赋给该位置。
    2. 如果将缓冲区中某个位置设置为256,那么该位置实际上是被赋值为0。
    3. 如果将缓冲区中某个位置设置成100.7这样的小数,那么该位置仅会存储整数部分,本例中存储的是100
    4. 如果尝试给超出缓冲区边界的位置赋值,那么赋值操作将以失败告终,缓冲区也不会发生变化

    除了修改和查看,还可以获取缓冲区长度:

    const length = buf.length;
    
    • 1

    切分缓冲区

    可以通过指定开始和结束位置来从一个长缓冲区中划分区域,从而创建一个小的缓冲区。

    // 使用缓冲对象上的slice方法,第一个参数为开始索引,第二个参数为结束索引
    var smallerBuffer = buf.slice(8,15);
    console.log(smallerBuffer.toString()); // 可以用toString查看
    
    • 1
    • 2
    • 3

    但是!slice创建小的缓冲区,并没有进行复制、分配新的内存,而是引用了父缓冲区中的内存,也就是只是保存了原来的地址,只是初始化了小缓冲区的头尾指针。所以有下面一些问题:

    1. 父缓冲区被修改,如果涉及子缓冲区的数据,同样也会被修改。
    2. 父缓冲区创建子缓冲区,之后如果成为内存垃圾,也不会被垃圾回收机制回收,有内存泄露。
    3. 那怎么办呢?看下一点。

    复制缓冲区

    可以使用copy方法,将一个缓冲区的一部分复制到另一个缓冲区中:

    const buf1 = new Buffer("this is the content of first buffer");
    let buf2 = new Buffer(11);
    
    /**
     * 参数分别为:
     * 1. 目标缓冲区
     * 2. 复制后,从目标中的哪个位置开始放置
     * 3. 被复制缓冲区中,复制开始的索引
     * 4. 被复制缓冲区中,复制结束的索引
     */
    buf1.copy(buf2,0,8,19); // buf2的内容 => the content
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    缓冲区解码

    缓冲区可以转换成UTF-8格式的字符串。

    var str = buf.toString();
    
    • 1

    如果给toString()传参,可以指定解码的编码格式。

    const str = buf.toString('base64');
    
    • 1

    小结

    1. 有时候不得不对二进制数据进行处理,但是原生JS并没有明确提供处理方法。
    2. Node的Buffer类对内存操作进行了封装,可以处理二进制。
    3. 二进制和字符串可以互相转换。
  • 相关阅读:
    毕业设计python选题高校研究生管理系统java选题版本源码 调试 开题 lw
    我的NeRF学习——初步认识
    保健用品智慧供应链管理系统:精细化管理供应商与采购环节,打造敏捷型供应链
    小景的Dba之路--压力测试和Oracle数据库缓存
    激活企业数字化采购价值,智慧采购管理系统助力半导体行业提升采购协同效率
    pytorch中gather函数的理解
    torch.hub.load报错urllib.error.HTTPError: HTTP Error 403: rate limit exceeded
    LeetCode 509 斐波那契数(动态规划)
    操作系统相关
    AWS VPC 概述
  • 原文地址:https://blog.csdn.net/qq_51574759/article/details/126724112