32

ArrayBuffers を追加/結合する好ましい方法は何ですか?

さまざまなデータ構造を持つネットワーク パケットを受信して​​解析しています。着信メッセージは ArrayBuffers に読み込まれます。部分的なパケットが到着した場合は、それを保存し、次のメッセージを待ってから解析を再試行する必要があります。

現在、私は次のようなことをしています:

function appendBuffer( buffer1, buffer2 ) {
  var tmp = new Uint8Array( buffer1.byteLength + buffer2.byteLength );
  tmp.set( new Uint8Array( buffer1 ), 0 );
  tmp.set( new Uint8Array( buffer2 ), buffer1.byteLength );
  return tmp.buffer;
}

明らかに、ArrayBuffers は固定長であるため、新しいバッファーを作成する必要はありませんが、型付き配列を初期化する必要はありますか? 到着したら、バッファをバッファとして扱えるようにしたいだけです。型と構造は関係ありません。

4

4 に答える 4

7

Blob を使用しないのはなぜですか? (その時点では利用できなかった可能性があることに気づきました)。

データを使用して Blob を作成し、var blob = new Blob([array1,array2,string,...])必要に応じて FileReader を使用して ArrayBuffer に戻すだけです (これを参照してください)。

これを確認してください: BlobBuilder と新しい Blob コンストラクターの違いは何ですか? そしてこれ:MDN Blob API

編集 :

これら 2 つの方法 (ブロブと質問で使用されている方法) の効率を比較したいと思い、JSPerf を作成しました: http://jsperf.com/appending-arraybuffers

Blob の使用は遅いようです (実際、最も時間がかかるのは Filereader を使用して Blob を読み取ることだと思います)。これでわかりました;) ArrayBufferが2つ以上ある場合(チャンクからファイルを再構築する場合など)、より効率的になるかもしれません。

于 2014-07-03T09:30:00.493 に答える
0
function concat (views: ArrayBufferView[]) {
    let length = 0
    for (const v of views)
        length += v.byteLength
        
    let buf = new Uint8Array(length)
    let offset = 0
    for (const v of views) {
        const uint8view = new Uint8Array(v.buffer, v.byteOffset, v.byteLength)
        buf.set(uint8view, offset)
        offset += uint8view.byteLength
    }
    
    return buf
}
于 2021-11-17T13:23:38.593 に答える
-3

特定の型付き配列ではなく、いつでもDataViewhttp://www.khronos.org/registry/typedarray/specs/latest/#8 )を使用できますが、質問へのコメントで述べたように、実際には使用できません。単独で多くのことをArrayBuffer行います。

于 2013-02-11T18:59:43.320 に答える