如何将一个NodeJS二进制缓冲区转换为JavaScript数组缓冲区?


当前回答

我尝试了上面的Float64Array,它只是没有工作。

我最终意识到,真正的数据需要读入正确的块视图。这意味着一次从源Buffer读取8个字节。

总之,这是我最后得到的……

var buff = new Buffer("40100000000000004014000000000000", "hex");
var ab = new ArrayBuffer(buff.length);
var view = new Float64Array(ab);

var viewIndex = 0;
for (var bufferIndex=0;bufferIndex<buff.length;bufferIndex=bufferIndex+8)            {

    view[viewIndex] = buff.readDoubleLE(bufferIndex);
    viewIndex++;
}

其他回答

令人惊讶的是,在我的情况下(电子:发送缓冲区渲染器ArrayBuffer),这只是工作

function bufferToArrayBuffer(buffer: Buffer): ArrayBuffer {
  return buffer.buffer as ArrayBuffer;
}

快了100倍

function bufferToArrayBuffer(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;
}

Buffer的实例也是node.js 4中Uint8Array的实例。X和更高。因此,最有效的解决方案是直接访问缓冲区自己的.buffer属性,如https://stackoverflow.com/a/31394257/1375574。Buffer构造函数也接受一个ArrayBufferView参数,如果你需要走另一个方向。

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


In older versions, node.js has both ArrayBuffer as part of v8, but the Buffer class provides a more flexible API. In order to read or write to an ArrayBuffer, you only need to create a view and copy across.

从Buffer到ArrayBuffer:

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

从ArrayBuffer到Buffer:

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

现在有一个非常有用的npm包:buffer https://github.com/feross/buffer

它试图提供一个API,是100%相同的节点的缓冲区API,并允许:

将类型化数组转换为缓冲区:https://github.com/feross/buffer#convert-typed-array-to-buffer 将缓冲区转换为类型化数组:https://github.com/feross/buffer#convert-buffer-to-typed-array

还有更多。

Buffer是ArrayBuffer的视图。你可以使用buffer属性访问内部包装的ArrayBuffer。

这是共享内存,不需要复制。

const arrayBuffer = theBuffer.buffer

如果你想要数据的副本,从原始的Buffer(不是从包装的ArrayBuffer)创建另一个Buffer,然后引用它的包装的ArrayBuffer。

const newArrayBuffer = Buffer.from(theBuffer).buffer

作为参考,从另一个方向,从ArrayBuffer到Buffer

const arrayBuffer = getArrayBuffer()
const sharedBuffer = Buffer.from(arrayBuffer)

const copiedBuffer = Buffer.from(sharedBuffer)
const copiedArrayBuffer = copiedBuffer.buffer

一种更快的写法

var arrayBuffer = new Uint8Array(nodeBuffer).buffer;

然而,在包含1024个元素的缓冲区上,这似乎比建议的toArrayBuffer函数慢了大约4倍。