• node.js中Buffer缓冲器的使用


    一、什么是Buffer

    Buffer缓冲器是用来存储输入和输出数据的一段内存。js语言没有二进制数据类型,在处理TCP和文件流的时候,就不是很方便了。

    所以node.js提供了Buffer类来处理二进制数据,Buffer类是一个全局变量,Buffer在创建的时候大小就固定了,无法改变。

    Buffer类的实例类似于由字节元素组成的数组,可以有效的表示二进制数据。

    二、什么是字节

    字节是计算机存储时的一种计量单位,一个字节等于8个位。一个位就代表0或1,每8个位(bit)组成一个字节(byte)。

    字节是网络传输数据的基本单位,一个字节最大表示的十进制数是255。

    三、什么是进制

    进制是人为定义的带进位的计数方法,常见的有二进制,八进制,十六进制,和十进制。

    将任意数字转换成不同进制

    console.log(parseInt('12', 2));
    console.log(parseInt('12', 8));
    console.log(parseInt('12', 16));
    console.log(parseInt('12', 10));
    

    转换进制的另一种方法:

    console.log((10).toString(2));
    console.log((10).toString(8));
    console.log((10).toString(16));
    console.log((10).toString(10));
    

      

    四、创建Buffer的方法

    通过Buffer.alloc来创建指定长度Buffer

    //创建6个字节的Buffer,用0填充数据
    let buf1 = Buffer.alloc(6);
    console.log(buf1);
    
    //指定数字进行填充
    let buf2 = Buffer.alloc(6, 2);
    console.log(buf2);
    
    //也可以指定字符进行填充,第三个参数表示字符编码,默认为utf8
    let buf3 = Buffer.alloc(6, 'a', 'utf8');
    console.log(buf3);
    

    通过Buffer.allocUnsafe创建未初始化的Buffer,Buffer中的数据是未知的。

    let buf = Buffer.allocUnsafe(6);
    console.log(buf);
    

    通过字节数组创建一个Buffer

    let buf = Buffer.from([1, 2, 3, 4, 5]);
    console.log(buf);
    

    通过字符串创建一个Buffer,第二个参数表示字符编码,一个中文用3个字节表示。

    let buf = Buffer.from('世界你好', 'utf8');
    console.log(buf);
    

      

    五、Buffer的一些常用方法

    通过 fill() 以指定的数据填充Buffer

    let buf = Buffer.alloc(12);
    console.log(buf);
    
    //参数一表示用来填充的值
    //参数二表示开始的偏移量
    //参数三表示结束的偏移量
    //参数四表示字符编码
    //偏移量的计算是左闭右开的区间,[start, end)
    buf.fill(1, 0, 2);
    console.log(buf);
    
    buf.fill(2, 2, 4);
    console.log(buf);
    
    buf.fill('A', 4, 6);
    console.log(buf);

    通过 write() 向Buffer中写入数据

    let buf = Buffer.alloc(12);
    console.log(buf);
    
    //参数一表示要写入的字符串
    //参数二表示写入的偏移量
    //参数三表示写入的字节数
    //参数四表示字符编码
    buf.write('世界', 0, 3);
    console.log(buf);
    console.log(buf.toString());
    
    buf.write('世界', 3, 6);
    console.log(buf);
    console.log(buf.toString());

    通过 writeInt8() 写入一个8位的整数,注意该整数是带符号的。

    let buf = Buffer.alloc(12);
    console.log(buf);
    
    buf.writeInt8(1, 0);
    buf.writeInt8(2, 1);
    buf.writeInt8(3, 2);
    //注意,8位的整数,如果带符号,区间在 -128 到 127 之间
    buf.writeInt8(127, 3);
    console.log(buf);

    方法中还有一些writeInt16BE(),writeInt32BE(),writeInt16LE(),writeInt32LE()的方法。

    因为不同的CPU架构,有不同的字节序,字节序是指数字在内存中保存的顺序。

    以 BE 结尾的,表示 Big Endian ,将高位存储在起始位置。

    以 LE 结尾的,表示 Little Endian,将低位存储在起始位置。

    let buf = Buffer.alloc(6);
    //将高位存储在起始位置
    buf.writeInt16BE('256', 0); // [01 00 00 00 00 00]
    console.log(buf);
    
    //读取要与写入的方法一致,不然数据会错乱。
    console.log(buf.readInt16BE(0));
    
    let buf2 = Buffer.alloc(6);
    //将低位存储在起始位置
    buf2.writeInt16LE('256', 0); // [00 01 00 00 00 00]
    console.log(buf2);
    
    //读取要与写入的方法一致,不然数据会错乱。
    console.log(buf.readInt16LE(0));

    通过 toString() 方法,将Buffer解码成字符串。

    let buf = Buffer.alloc(12);
    
    buf.write('世', 0, 3);
    buf.write('界', 3, 3);
    buf.write('你', 6, 3);
    buf.write('好', 9, 3);
    console.log(buf);
    console.log(buf.toString());

    通过 slice() 创建一个新的Buffer切片,但是内存的指向与原Buffer仍然是同一块内存。

    let buf = Buffer.alloc(12, 6);
    console.log(buf);
    
    //参数一表示开始切片偏移量
    //参数二表示结束切片偏移量
    let buf2 = buf.slice(0, 3);
    buf2.fill(9);
    console.log(buf);

    通过 copy() 拷贝一个Buffer的数据到另一个Buffer

    let t_buf = Buffer.alloc(12);
    
    let s_buf = Buffer.alloc(6);
    s_buf.write('世界', 0);
    console.log(s_buf.toString());
    
    //参数一表示,拷贝进的Buffer
    //参数二表示,拷贝进Buffer的开始偏移量
    //参数三表示,源Buffer的开始拷贝偏移量
    //参数四表示,源Buffer的结束拷贝偏移量
    s_buf.copy(t_buf, 0, 0, 6);
    console.log(t_buf.toString());

    通过 Buffer.concat() 可以合并多个Buffer,返回一个新Buffer

    let buf1 = Buffer.alloc(6);
    buf1.write('hello,');
    let buf2 = Buffer.alloc(6);
    buf2.write('世界');
    
    let buf3 = Buffer.concat([buf1, buf2]);
    console.log(buf3.toString());
    
    //如果合并后的Buffer字节数大于设置的值,则会截断
    let buf4 = Buffer.concat([buf1, buf2], 9);
    console.log(buf4.toString());

    判断是否为一个Buffer

    console.log(Buffer.isBuffer({'name': 'test'}));
    
    console.log(Buffer.isBuffer(Buffer.from('test')));

    通过 Buffer.byteLength() 获取字符串字节长度

    console.log(Buffer.byteLength('你好,世界'));
    

      

  • 相关阅读:
    16、集合--Map接口
    LVM快照备份与恢复
    CentOS 6.3下配置LVM(逻辑卷管理)
    Tomcat 9.0 配置问题 403 Access Denied
    nginx和php-fpm调用方式
    Linux下安装php环境并且配置Nginx支持php-fpm模块
    Nginx 服务器安装及配置文件详解
    Linux编辑器vim键盘详解
    Nginx配置文件详解
    keepalive配置文件详解
  • 原文地址:https://www.cnblogs.com/jkko123/p/10229368.html
Copyright © 2020-2023  润新知