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


当前回答

令人惊讶的是,在我的情况下(电子:发送缓冲区渲染器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;
}

其他回答

我已经将节点更新到5.0.0版本 我在研究这个:

function toArrayBuffer(buffer){
    var array = [];
    var json = buffer.toJSON();
    var list = json.data

    for(var key in list){
        array.push(fixcode(list[key].toString(16)))
    }

    function fixcode(key){
        if(key.length==1){
            return '0'+key.toUpperCase()
        }else{
            return key.toUpperCase()
        }
    }

    return array
}

我用它来检查我的vhd磁盘映像。

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

令人惊讶的是,在我的情况下(电子:发送缓冲区渲染器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;
}

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

一种更快的写法

var arrayBuffer = new Uint8Array(nodeBuffer).buffer;

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