nodejs 二进制与Buffer

Buffer 介绍

javascript 中对数据处理都是以字符串的形式,而对于二进制数据就不便于处理,因此 Buffer 即是用于读取或操做二进制数据都对象。javascript

一句话归纳: Buffer 类是一个全局变量,用于直接处理二进制数据,提供工具类方法。java

官网上关于 Buffer 解释的很是清楚,因此就再也不拷贝官网,这里列举一些使用较为频繁的场景。数组

对象转换成Buffer

在操做文件或者IO的场景中,咱们须要将对象转换成二进制数据流。函数

引用官方文档工具

  • Buffer.from(array) 返回一个新的 Buffer,其中包含提供的八位字节数组的副本。ui

  • Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一个新的 Buffer,它与给定的 ArrayBuffer 共享相同的已分配内存。编码

  • Buffer.from(buffer) 返回一个新的 Buffer,其中包含给定 Buffer 的内容的副本。spa

  • Buffer.from(string[, encoding]) 返回一个新的 Buffer,其中包含提供的字符串的副本。3d

  • Buffer.alloc(size[, fill[, encoding]]) 返回一个指定大小的新建的的已初始化的 Buffer。 此方法比 Buffer.allocUnsafe(size) 慢,但能确保新建立的 Buffer 实例永远不会包含可能敏感的旧数据。code

  • Buffer.allocUnsafe(size) 和 Buffer.allocUnsafeSlow(size) 分别返回一个指定大小的新建的未初始化的 Buffer。 因为 Buffer 是未初始化的,所以分配的内存片断可能包含敏感的旧数据。

栗子以下

const obj = {
    name:'test'
}
const buffer = Buffer.from(JSON.stringify(obj),'utf8') // 默认编码是 utf8 
复制代码

Buffer 对象转换成其它机制的字符串

咱们能够看到 Buffer 对象是一个 Uint8Array 的实例,因此咱们可使用迭代器获取 Buffer 中数组的值。

buffer

  1. Buffer 对象转二进制字符串,便利获取到数组中的值,经过 Number.toString(radix) 方法,将整形转换成二进制字符串,最后将各个数值的二进制字符串拼接起来便可。但为了后续对二进制操做方便,因此咱们约定好二进制的长度,由于 Buffer 数组是在 0 到 255 之间的整数数组,255 的二进制是 8 位,因此咱们在转换过程当中把不足八位的前置补零,固然这仍是得看具体的场景.
bytesToBinary(bytes) {
    const length = bytes.length;
    let result = '';
    for (let i = 0; i < length; i++) {
        const binStr = Number(bytes[i]).toString(2)
        result +=  '0'.repeat(8 - binStr.length) + binStr; // 不足八位前置补0
    }
    return result.toString();
}
复制代码
  1. Buffer转成 16 进制也是相似,以下
bytesToBinary(bytes) {
    const length = bytes.length;
    let result = '';
    for (let i = 0; i < length; i++) {
        const binStr = Number(bytes[i]).toString(16)
        result +=  '0'.repeat(2 - binStr.length) + binStr; // 不足二位前置补0
    }
    return result.toString();
}
复制代码

小结

关于 Buffer 的介绍网上有不少文章,但我以为都不如官网写的清晰,因此建议你们直接看文档。

后续会继续补充在工做中遇到与 Buffer 相关的使用场景,毕竟工具类函数只有在具体场景下分析才更有价值。