2016-04-07 13 views
0

Başka bir işlevden aldığım bir ofsetle bir Uint8Array sahibim. Bu, ihtiyacım olan verileri içerir, ancak bu yazılan diziyi destekleyen arabelleğin başlangıcında başka şeyler de vardır.Bir Uint8Array'i ofset ile bir Int32Array'e nasıl dönüştürebilirim?

Gerçek veriler 32 bit tamsayıdır ve bu verileri Int32Array'da kullanmak istiyorum.

var outputBuffer = new ArrayBuffer(data.length); 
    var inputByteArray = new Uint8Array(outputBuffer); 
    for (var i=0; i < data.length; ++i) { 
    inputByteArray[i] = data[i] 
    } 
    var outputInt32Array= new Int32Array(outputBuffer); 

sadece kaynak yeni Int32Array oluşturma ve geçme dolaysız yolu Uint8Array çalışmıyor: Ama bu dönüştürerek, Şu anda elle aşağıdaki şekilde yapıyorum basit olması görünmüyor

var outputInt32Array = new Int32Array(data) // data is the Uint8Array with offset 

Bu, bir Uint8Array gibi davranan ve 32 bit tamsayılar değil, bireysel baytları dağıtan yazılan bir diziyle sonuçlanır. Ben hata alıyorum çalışmıyor da offset de geçerek onu çalışılıyor

var outputInt32Array = new Int32Array(data.buffer, data.byteOffset, length) 

elle sadece her byte kopyalama mı: "RangeError: Int32Array ofset başlamadan 4 katı olması gerektiği" Int32Array bir offset ile bir Int8Array almak için nasıl?

+0

Btw, eğer yeni bir Int32Array (veri) 'yi yaparsanız, her bir" Uint8 "öğesini" veri "den" Int32 "ye, yani arabelleğin boyutunu dört katına okur. – Bergi

cevap

3

Hayır, baytları bir dizinden diğerine elle kopyalamanıza gerek yoktur. new Int32Array(data.buffer, …)'u kullanmak en iyi yaklaşımdır, ancak garip bir ofsetiniz varsa, düzgün şekilde hizalanmış ikinci bir arabellek kullanmanız gerekecektir. Yine de, sadece slice method kullanabilirsiniz, elle kopyalamak gerekmez:

var outputInt32Array = new Int32Array(data.buffer.slice(data.byteOffset), 0, length); 

Eğer data olarak aynı tampon üzerindeki Int32s erişmesi gerekiyorsa, ayrıca bir DataView kullanabilirsiniz.

İlgili konular