2016-09-15 10 views
0

2つの既存の配列バッファの2つを新しいものに結合する必要があります。Javascript combine ArrayBuffer parts

私はパーサを構築していますが、データはランダムなサイズの配列バッファに入っています。データは1つの末尾に、もう一方の先頭に流出します。だから私は新しい出力バッファを作成して、あるバッファの終わりの部分ともう一方のバッファの先頭部分にコピーする必要があります。出力は単にArraybufferになります。

このデモからは、Uint8Arraysをいくつかのオフセットを使って作成し、setを使用することになっていましたが、特定の組み合わせはInvalid typed array lengthをスローします。私は各配列の長さやオフセットをあらかじめ知っていません。

var buffer1 = new ArrayBuffer(8); 
var buffer2 = new ArrayBuffer(8); 
var buffer3 = new ArrayBuffer(8); 

var uint8_1 = new Uint8Array(buffer1); 
var uint8_2 = new Uint8Array(buffer2); 
var uint8_3 = new Uint8Array(buffer3); 

uint8_1.fill(1); 
uint8_2.fill(2); 

var uint8_1_slice = new Uint8Array(buffer1 , 0 , 3); 
var uint8_2_slice = new Uint8Array(buffer2 , 4, 7); 

このデモでは、buffer3を1,1,1,1,2,2,2,2にする必要があります。

は、このデモのためにスライス

答えて

1

を使用することはできませんbuffer3は1,1,1,1,2,2,2,2であることを取得する必要があります。あなたはforループを使用することができます

変数nが他uint8_1.byteLength/2uint8_2で値にuint8_3を設定するよりも小さい場合、uint8_1値にuint8_3を設定します。

var len = 8; 
 

 
var buffer1 = new ArrayBuffer(len); 
 
var buffer2 = new ArrayBuffer(len); 
 
var buffer3 = new ArrayBuffer(len); 
 

 
var uint8_1 = new Uint8Array(buffer1); 
 
var uint8_2 = new Uint8Array(buffer2); 
 
var uint8_3 = new Uint8Array(buffer3); 
 

 
uint8_1.fill(1); 
 
uint8_2.fill(2); 
 
// `len` : uint8_1.byteLength/2 + uint8_2.byteLength/2 
 
for (var n = 0; n < len; n++) { 
 
    uint8_3[n] = n < len/2 ? uint8_1[n] : uint8_2[n]; 
 
} 
 

 
console.log(uint8_3);

+0

これは適切なトラックにあります。設定しないと、一度に1バイトをコピーしていないので、セットを使用する必要があります。 – brianxautumn

+0

実際には申し訳ありませんが、スライスは使用できません。新しい配列が返されます。 – brianxautumn

+0

@brianxautumn _ "実際には申し訳ありませんが、スライスを使用できません。新しい配列が返されます。"新しい配列を作成しないという要件はありますか? – guest271314

0

私は一部の人だけarray.lengthを使用し見てきました。配列が要素あたり1バイトだけであれば問題ありません。他の型付き配列がいっぱいになっていても、この例ではa2ではない場合も問題ありません。そのため、byteLengthを使用する方が良い理由は、これはBlobコンストラクタがどのように部品を連結するかでもあります。

// Concatenate a mix of typed arrays 
function concatenate(...arrays) { 
    // Calculate byteSize from all arrays 
    let size = arrays.reduce((a,b) => a + b.byteLength, 0) 
    // Allcolate a new buffer 
    let result = new Uint8Array(size) 

    // Build the new array 
    let offset = 0 
    for (let arr of arrays) { 
    result.set(arr, offset) 
    offset += arr.byteLength 
    } 

    return result 
} 

// the total length of 1-3 = 5 
// the total byteLength of 1-3 = 6 
let a1 = Uint8Array.of(1, 2) // [1, 2] 
let a2 = Uint16Array.of(3) // [3] just for the fun of it 16 takes up 2 bytes 
let a3 = Uint8Array.of(4, 5) // [4, 5] 

concatenate(a1, a2, a3) // [1, 2, 3, 0, 4, 5] 

/********/ 
var blob = new Blob([a1, a2, a3]) 
var res = new Response(blob) 
res.arrayBuffer().then(buffer => console.log(new Uint8Array(buffer))) 
// [1, 2, 3, 0, 4, 5]