将二进制 NodeJS Buffer 转换为 JavaScript ArrayBuffer

如何将 NodeJS 二进制缓冲区转换为 JavaScript ArrayBuffer?


答案 1

缓冲区的实例也是 node.js 4.x 及更高版本中 Uint8Array 的实例。因此,最有效的解决方案是按照 https://stackoverflow.com/a/31394257/1375574 直接访问该物业。Buffer 构造函数还采用 ArrayBufferView 参数(如果需要转到另一个方向)。buf.buffer

请注意,这不会创建副本,这意味着对任何 ArrayBufferView 的写入都将写入原始 Buffer 实例。


在旧版本中,node.js将 ArrayBuffer 作为 v8 的一部分,但 Buffer 类提供了更灵活的 API。为了读取或写入 ArrayBuffer,您只需要创建一个视图并复制。

从缓冲区到数组缓冲区:

function toArrayBuffer(buf) {
    const ab = new ArrayBuffer(buf.length);
    const view = new Uint8Array(ab);
    for (let i = 0; i < buf.length; ++i) {
        view[i] = buf[i];
    }
    return ab;
}

从数组缓冲区到缓冲区:

function toBuffer(ab) {
    const buf = Buffer.alloc(ab.byteLength);
    const view = new Uint8Array(ab);
    for (let i = 0; i < buf.length; ++i) {
        buf[i] = view[i];
    }
    return buf;
}

答案 2

无依赖关系,最快,Node.js 4.x 及更高版本

Buffers 是 s,所以你只需要切片(复制)它的背衬区域。Uint8ArrayArrayBuffer

// Original Buffer
let b = Buffer.alloc(512);
// Slice (copy) its segment of the underlying ArrayBuffer
let ab = b.buffer.slice(b.byteOffset, b.byteOffset + b.byteLength);

和偏移量是必需的,因为小的 s(默认情况下小于 4 kB,池大小的一半)可以在共享上查看。如果不进行切片,则最终可能会得到来自另一个 .请参阅文档中的说明sliceBufferArrayBufferArrayBufferBuffer

如果您最终需要一个 TypedArray,则可以在不复制数据的情况下创建一个:

// Create a new view of the ArrayBuffer without copying
let ui32 = new Uint32Array(b.buffer, b.byteOffset, b.byteLength / Uint32Array.BYTES_PER_ELEMENT);

没有依赖性,中等速度,任何版本的Node.js

使用马丁·汤姆森的答案,它以O(n)时间运行。(另请参阅我对他关于非优化的答案的评论的回复。使用数据视图很慢。即使您需要翻转字节,也有更快的方法可以做到这一点。

依赖性、快速、节点.js ≤ 0.12 或 iojs 3.x

您可以使用 https://www.npmjs.com/package/memcpy 向任一方向(缓冲区到数组缓冲区并返回)。它比这里发布的其他答案更快,并且是一个写得很好的库。节点 0.12 到 iojs 3.x 需要 ngossen 的分叉(请参阅此处)。