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


当前回答

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

其他回答

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倍。

NodeJS,在某一时刻(我想是v0.6.x)有ArrayBuffer支持。我在这里创建了一个用于base64编码和解码的小库,但自从更新到v0.7以来,测试(在NodeJS上)失败了。我正在考虑创建一些标准化的东西,但在此之前,我认为应该使用节点的本机缓冲区。

我尝试了上面的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++;
}

这个代理将把缓冲区暴露为任何typedarray,没有任何副本。:

https://www.npmjs.com/package/node-buffer-as-typedarray

它只能在LE上工作,但是可以很容易地移植到be上。 而且,从来没有真正测试过这有多高效。