在前端开发中,我们经常需要处理二进制数据(如图片、音频、视频等),而 JavaScript 自身并没有特别方便的处理二进制数据的能力。这时,我们可以使用 npm 包提供的一些工具来更好地处理二进制数据。本文将介绍一个处理二进制数据的 npm 包 buffered2 的使用教程。
buffered2 是什么?
buffered2 是一个 Node.js 模块,它扩展了 Node.js 内置模块 Buffer,提供了更高级和更方便的功能,使得 Buffer 的使用更加灵活和便捷。
buffered2 主要提供以下功能:
维护一个缓冲区队列,使用的时候可以更好地处理大规模二进制文件。
可以在读取数据的同时进行解析,读取过程中不需要全部将数据加载到内存中去。
可以直接对 buffer 进行扩展来进行交叉引用等更高级的操作。
buffered2 的作者基于 Buffer 传统 API 生成了新的 API,并添加了各种实用工具。现在,我们来看看不同的 API 和实用工具。
buffered2 包的安装
在开始使用 buffered2 之前,请先确保你已经安装了 Node.js 和 npm 管理工具。在命令行中输入以下命令即可安装 buffered2 包:
npm install buffered2
buffered2 使用方法
- 创建 buffered2 对象
const Buffered2 = require('buffered2'); const fs = require('fs'); const bufferedObj = new Buffered2(fs.readFileSync('path/to/file'));
使用 bufferedObj 构造函数,可以传入文件路径(或者使用 buffer 构建),也可以传入已有的 buffer。此时,Buffered2 会自动维护一个缓冲区队列,方便我们进行一系列后续操作。
- 读取文件或 buffer
const fs = require('fs'); const Buffered2 = require('buffered2'); const data = fs.readFileSync('path/to/file'); const buffer = Buffer.from(data); const bufferedObj = new Buffered2(buffer);
根据文件路径或者 buffer 构建 Buffered2 对象。
- 读取带有长度前缀的数据块
bufferedObj.readLengthPrefixedData(function (data) { console.log(data); });
bufferedObj.readLengthPrefixedData 方法为读取带有长度前缀的数据块。这个方法会自动找到下一个长度前缀,在读取数据块时根据长度前缀指定读取的长度。读取完成并成功解码后,调用回调函数,并将读取的数据块作为参数传递进来。
使用这个方法需要结合整数类型支持库。
const Int64LE = require('int64-buffer').Int64LE; bufferedObj.readLengthPrefixedData(function (data, length) { console.log(`data length: ${length}`); // 输出数据块的长度 console.log(`data: ${data}`); // 输出读取的数据块 console.log(`int64: ${new Int64LE(data.slice(0, 8)).toNumber()}`); // 解析 int64 数据 });
- 读取数据
bufferedObj.read(4, function (data) { console.log(data); // 输出前 4 个字节 });
bufferedObj.read 方法为读取 buffer 里的任意数量数据块,可以理解为对 buffer 进行切片。使用这个方法需要有回调函数,当读取完毕后执行回调函数,将读取成功的 buffer 送入回调函数处理。
- 读取常用的 C 数据类型
console.log(bufferedObj.readIntLE(0, 2)); // 读取 2 个字节宽度的整数并转换为有符号数 console.log(bufferedObj.readUIntLE(0, 2)); // 读取 2 个字节宽度的整数并转换为无符号数 console.log(bufferedObj.readUInt32BE(0)); // 读取 4 个字节宽度的整数并转换为无符号数
除上述方法之外,buffered2 还提供了一些读取数据的方法,可以根据需要进行采用。
示例代码
-- -------------------- ---- ------- ----- ------- - -------------------------------- ----- --- - --- ------------------------------------------- -- ------------ ----------------------------------- ------ ------- - ----------------- ------- ------------ -- -------- ------------------ ---------- -- -------- ------------------- ----- --------------------- ------------------ -- -- ----- -- --- -- --- ----- ------ - --- ------------ --- ---- - -- ----------------- -------- ------- - ---- -- ------------- -------------------- ----- ----- ---- --- ----- ---------- --- ---------------- -------- -- - ------------------ ---------- --- ----------------------- -------- ------ - ----------------- ----- ---------- --- ----------------------------
以上代码演示了如何使用 Buffered2 来读取带有长度前缀的数据块以及如何使用 Buffered2 读取 buffer 并计算它的长度。当使用 stream 文件流时,可以直接通过 stream 管道处理数据(并通过 process.stdout 打印出来),其中 size 表示读入数据总长度,fulldata 函数表示数据已经读取完毕。
结论
虽然 JavaScript 并不是专门用于处理数据的语言,但是经过不断的发展和完善,现在可以得到各种高性能的处理数据的工具和库,其中 Buffered2 就是一个非常好的工具。它提供了更高级、更方便和更灵活的功能,使得处理二进制数时非常方便,有了它,我们可以轻松地处理各种复杂的二进制数据。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60066c8bccdc64669dde5377