zoukankan      html  css  js  c++  java
  • Node 之 Buffer

    Buffer(缓冲器)

    Buffer.alloc(size[, fill[, encoding]])

    分配一个大小为 size 字节的新 Buffer。 如果 fillundefined,则用零填充 Buffer

    const buf = Buffer.alloc(5);
    
    console.log(buf);
    // 打印: <Buffer 00 00 00 00 00>
    

    如果指定了 fill,则分配的 Buffer 通过调用 buf.fill(fill) 进行初始化。

    const buf = Buffer.alloc(5, 'a');
    
    console.log(buf);
    // 打印: <Buffer 61 61 61 61 61>
    

    如果同时指定了 fillencoding,则分配的 Buffer 通过调用 buf.fill(fill, encoding) 进行初始化 。

    const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
    
    console.log(buf);
    // 打印: <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
    

    调用 Buffer.alloc() 可能比替代的 Buffer.allocUnsafe() 慢得多,但能确保新创建的 Buffer 实例的内容永远不会包含来自先前分配的敏感数据,包括可能尚未分配给 Buffer 的数据。

    Buffer.allocUnsafe(size)

    以这种方式创建的 Buffer 实例的底层内存是未初始化的。 新创建的 Buffer 的内容是未知的,可能包含敏感数据。 使用 Buffer.alloc() 可以创建以零初始化的 Buffer 实例。

    const buf = Buffer.allocUnsafe(10);
    
    console.log(buf);
    // 打印(内容可能有所不同): <Buffer a0 8b 28 3f 01 00 00 00 50 32>
    
    buf.fill(0);
    
    console.log(buf);
    // 打印: <Buffer 00 00 00 00 00 00 00 00 00 00>
    

    Buffer.concat(list[, totalLength])

    如果没有提供 totalLength,则通过将 list 中的 Buffer 实例的长度相加来计算得出。

    如果提供了 totalLength,则会强制转换为无符号整数。 如果 list 中的 Buffer 合并后的总长度大于 totalLength,则结果会被截断到 totalLength 的长度。

    // 用含有三个 `Buffer` 实例的数组创建一个单一的 `Buffer`。
    
    const buf1 = Buffer.alloc(10);
    const buf2 = Buffer.alloc(14);
    const buf3 = Buffer.alloc(18);
    const totalLength = buf1.length + buf2.length + buf3.length;
    
    console.log(totalLength);
    // 打印: 42
    
    const bufA = Buffer.concat([buf1, buf2, buf3], totalLength);
    
    console.log(bufA);
    // 打印: <Buffer 00 00 00 00 ...>
    console.log(bufA.length);
    // 打印: 42
    

    Buffer.from

    const arr = new Uint16Array(2);
    
    arr[0] = 5000;
    arr[1] = 4000;
    
    // 与 `arr` 共享内存。
    const buf = Buffer.from(arr.buffer);
    
    console.log(buf);
    // 打印: <Buffer 88 13 a0 0f>
    
    // 改变原先的 Uint16Array 也会改变 Buffer。
    arr[1] = 6000;
    
    console.log(buf);
    // 打印: <Buffer 88 13 70 17>
    
    const buf1 = Buffer.from('buffer');
    const buf2 = Buffer.from(buf1);
    
    buf1[0] = 0x61;
    
    console.log(buf1.toString());
    // 打印: auffer
    console.log(buf2.toString());
    // 打印: buffer
    

    Buffer.isBuffer(obj)

    如果 obj 是一个 Buffer,则返回 true,否则返回 false

    Buffer.isEncoding(encoding)

    如果 encoding 是支持的字符编码的名称,则返回 true,否则返回 false

    console.log(Buffer.isEncoding('utf-8'));
    // 打印: true
    
    console.log(Buffer.isEncoding('hex'));
    // 打印: true
    
    console.log(Buffer.isEncoding('utf/8'));
    // 打印: false
    
    console.log(Buffer.isEncoding(''));
    // 打印: false
    

    buf.buffer

    const arrayBuffer = new ArrayBuffer(16);
    const buffer = Buffer.from(arrayBuffer);
    
    console.log(buffer.buffer === arrayBuffer);
    // 打印: true
    

    buf.entries()

    buf 的内容创建并返回一个 [index, byte] 形式的迭代器

    // 记录 `Buffer` 的全部内容。
    
    const buf = Buffer.from('buffer');
    
    for (const pair of buf.entries()) {
      console.log(pair);
    }
    // 打印:
    //   [0, 98]
    //   [1, 117]
    //   [2, 102]
    //   [3, 102]
    //   [4, 101]
    //   [5, 114]
    

    buf.equals(otherBuffer)

    如果 bufotherBuffer 具有完全相同的字节,则返回 true,否则返回 false。 相当于 buf.compare(otherBuffer) === 0

    const buf1 = Buffer.from('ABC');
    const buf2 = Buffer.from('414243', 'hex');
    const buf3 = Buffer.from('ABCD');
    
    console.log(buf1.equals(buf2));
    // 打印: true
    console.log(buf1.equals(buf3));
    // 打印: false
    

    buf.includes(value[, byteOffset][, encoding])

    const buf = Buffer.from('this is a buffer');
    
    console.log(buf.includes('this'));
    // 打印: true
    console.log(buf.includes('is'));
    // 打印: true
    console.log(buf.includes(Buffer.from('a buffer')));
    // 打印: true
    console.log(buf.includes(97));
    // 打印: true(97 是 'a' 的十进制 ASCII 值)
    console.log(buf.includes(Buffer.from('a buffer example')));
    // 打印: false
    console.log(buf.includes(Buffer.from('a buffer example').slice(0, 8)));
    // 打印: true
    console.log(buf.includes('this', 4));
    // 打印: false
    

    buf.indexOf(value[, byteOffset][, encoding])

    const buf = Buffer.from('this is a buffer');
    
    console.log(buf.indexOf('this'));
    // 打印: 0
    console.log(buf.indexOf('is'));
    // 打印: 2
    console.log(buf.indexOf(Buffer.from('a buffer')));
    // 打印: 8
    console.log(buf.indexOf(97));
    // 打印: 8(97 是 'a' 的十进制 ASCII 值)
    console.log(buf.indexOf(Buffer.from('a buffer example')));
    // 打印: -1
    console.log(buf.indexOf(Buffer.from('a buffer example').slice(0, 8)));
    // 打印: 8
    
    const utf16Buffer = Buffer.from('u039au0391u03a3u03a3u0395', 'utf16le');
    
    console.log(utf16Buffer.indexOf('u03a3', 0, 'utf16le'));
    // 打印: 4
    console.log(utf16Buffer.indexOf('u03a3', -4, 'utf16le'));
    // 打印: 6
    

    buf.keys()

    创建并返回 buf 键名(索引)的迭代器

    const buf = Buffer.from('buffer');
    
    for (const key of buf.keys()) {
      console.log(key);
    }
    // 打印:
    //   0
    //   1
    //   2
    //   3
    //   4
    //   5
    

    buf.length

    // 创建一个 `Buffer`,并使用 UTF-8 写入一个短的字符串。
    
    const buf = Buffer.alloc(1234);
    
    console.log(buf.length);
    // 打印: 1234
    
    buf.write('http://nodejs.cn/', 0, 'utf8');
    
    console.log(buf.length);
    // 打印: 1234
    

    buf.values()

    创建并返回 buf 键值(字节)的迭代器。 当对 Buffer 使用 for..of 时会调用该函数。

    const buf = Buffer.from('buffer');
    
    for (const value of buf.values()) {
      console.log(value);
    }
    // 打印:
    //   98
    //   117
    //   102
    //   102
    //   101
    //   114
    
    for (const value of buf) {
      console.log(value);
    }
    // 打印:
    //   98
    //   117
    //   102
    //   102
    //   101
    //   114
    
    一个幽默的前端爱好者,记录下自己的心得体会
  • 相关阅读:
    07java基础知识
    06java基础知识
    我们都忽略了Html5的力量,如果只看成一种技术就大错特错了!
    “微信应用号对行业影响”之一,app开发速来围观
    App开发中甲乙方冲突会闹出啥后果?H5 APP 开发可以改变现状吗
    开发APP不搞清楚这20个问题,必然沦为一场灾难
    H5 App设计者需要注意的21条禁忌
    H5 APP开发必读,20个你不知道的Html5新特征和窍门
    H5 App如此强悍,要降薪的恐怕已不只是iOS程序员
    关于APP,原生和H5开发技术的争论
  • 原文地址:https://www.cnblogs.com/little-oil/p/14759909.html
Copyright © 2011-2022 走看看