180

NodeJSバイナリバッファーをJavaScriptArrayBufferに変換するにはどうすればよいですか?

4

13 に答える 13

189

のインスタンスBufferUint8Arrayは、node.js 4.x 以降の のインスタンスでもあります。したがって、最も効率的な解決策は、https://stackoverflow.com/a/31394257/1375574buf.bufferに従ってプロパティに直接アクセスすることです。他の方向に進む必要がある場合、Buffer コンストラクターは ArrayBufferView 引数も受け取ります。

これはコピーを作成しないことに注意してください。つまり、ArrayBufferView への書き込みは元の Buffer インスタンスに書き込まれます。


古いバージョンでは、node.js には v8 の一部として両方の ArrayBuffer がありますが、Buffer クラスはより柔軟な API を提供します。ArrayBuffer を読み書きするには、ビューを作成してコピーするだけです。

Buffer から ArrayBuffer へ:

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

ArrayBuffer からバッファへ:

function toBuffer(ab) {
    const buf = Buffer.alloc(ab.byteLength);
    const view = new Uint8Array(ab);
    for (let i = 0; i < buf.length; ++i) {
        buf[i] = view[i];
    }
    return buf;
}
于 2012-08-23T22:41:43.017 に答える
80

「ArrayBuffer から Buffer へ」は、次の方法で実行できます。

var buffer = Buffer.from( new Uint8Array(ab) );
于 2013-06-12T11:20:07.340 に答える
11

次の優れた npm パッケージを使用してください: to-arraybuffer.

または、自分で実装することもできます。バッファが呼び出されている場合は、次bufのようにします。

buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)
于 2014-03-04T07:17:23.177 に答える
2

ArrayBufferは型付きの と考えることができますBuffer

したがって、ArrayBuffer常に型 (いわゆる「配列バッファー ビュー」) が必要です。通常、Array Buffer ViewのタイプはUint8ArrayまたはUint16Arrayです。

ArrayBuffer と String の間の変換に関する Renato Mangini の優れた記事があります。

コード例 (Node.js の場合) に重要な部分をまとめました。ArrayBufferまた、typedと untyped の間で変換する方法も示します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!"
于 2017-08-30T16:31:12.447 に答える
0

Float64Array に対して上記を試しましたが、うまくいきませんでした。

私は、実際にデータを正しいチャンクでビューに「INTO」する必要があることに気付きました。これは、ソース バッファから一度に 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++;
}
于 2015-07-06T09:54:27.970 に答える
-2

NodeJS は、ある時点 (v0.6.x だったと思います) で ArrayBuffer をサポートしていました。ここで base64 エンコードとデコード用の小さなライブラリを作成しましたが、v0.7 に更新してから (NodeJS での) テストが失敗します。これを正規化するものを作ろうと思っているのですが、それまではNodeのネイティブBufferを使うべきだと思います。

于 2012-01-26T08:50:04.093 に答える
-6

私はすでにノードをバージョン 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 ディスク イメージを確認します。

于 2015-11-09T09:57:17.767 に答える