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


当前回答

我已经将节点更新到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磁盘映像。

其他回答

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

使用以下优秀的npm包:to-arraybuffer。

或者,您可以自己实现它。如果你的缓冲区叫buf,这样做:

buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)

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

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

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

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

可以把ArrayBuffer看作是类型化的Buffer。

因此,ArrayBuffer总是需要一个类型(所谓的“数组缓冲区视图”)。通常,数组缓冲区视图有Uint8Array或Uint16Array类型。

Renato Mangini有一篇关于ArrayBuffer和String之间转换的好文章。

我在一个代码示例中总结了基本部分(用于Node.js)。它还展示了如何在类型化的ArrayBuffer和非类型化的Buffer之间进行转换。

function stringToArrayBuffer(string) {
  const arrayBuffer = new ArrayBuffer(string.length);
  const arrayBufferView = new Uint8Array(arrayBuffer);
  for (let i = 0; i < string.length; i++) {
    arrayBufferView[i] = string.charCodeAt(i);
  }
  return arrayBuffer;
}

function arrayBufferToString(buffer) {
  return String.fromCharCode.apply(null, new Uint8Array(buffer));
}

const helloWorld = stringToArrayBuffer('Hello, World!'); // "ArrayBuffer" (Uint8Array)
const encodedString = new Buffer(helloWorld).toString('base64'); // "string"
const decodedBuffer = Buffer.from(encodedString, 'base64'); // "Buffer"
const decodedArrayBuffer = new Uint8Array(decodedBuffer).buffer; // "ArrayBuffer" (Uint8Array)

console.log(arrayBufferToString(decodedArrayBuffer)); // prints "Hello, World!"