如何将一个NodeJS二进制缓冲区转换为JavaScript数组缓冲区?
当前回答
一种更快的写法
var arrayBuffer = new Uint8Array(nodeBuffer).buffer;
然而,在包含1024个元素的缓冲区上,这似乎比建议的toArrayBuffer函数慢了大约4倍。
其他回答
一种更快的写法
var arrayBuffer = new Uint8Array(nodeBuffer).buffer;
然而,在包含1024个元素的缓冲区上,这似乎比建议的toArrayBuffer函数慢了大约4倍。
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
"From ArrayBuffer to Buffer"可以这样做:
var buffer = Buffer.from( new Uint8Array(arrayBuffer) );
使用以下优秀的npm包:to-arraybuffer。
或者,您可以自己实现它。如果你的缓冲区叫buf,这样做:
buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)
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;
}