2016-04-07 4 views
0

私は別の関数から受け取ったオフセットを持つUint8Arrayを持っています。これには必要なデータが含まれていますが、この型付き配列をバッキングしているバッファの先頭には少しのものがあります。Uint8Arrayをオフセット付きでInt32Arrayに変換するにはどうすればよいですか?

実際のデータは32ビットの整数なので、そのデータをInt32Arrayに入れたいと思います。

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); 

ちょうど新しいInt32Arrayを作成し、Uint8Arrayが動作しないソースを渡す簡単な方法:

をしかし、これは簡単ではないようです変換、私は現在、次のように手動でそれをやっています
var outputInt32Array = new Int32Array(data) // data is the Uint8Array with offset 

この結果、Uint8Arrayのように動作し、32ビット整数ではなく個々のバイトが引き渡されます。 、私はエラーを取得する動作しません。また、オフセットに渡すことで、それをしようと

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

を手動でのみ、各バイトをコピーしている:「例外RangeErrorは:Int32Arrayの開始オフセットは4の倍数でなければなりません」 Int8ArrayをInt8Arrayからオフセットで取得する方法はありますか?

+0

Btwは、 'new Int32Array(data)'を実行すると、 'Uint8'を' data'から 'Int32'に読み込みます。すなわち、バッファのサイズを4倍にします。 – Bergi

答えて

3

いいえ、手動で別の配列にバイトをコピーする必要はありません。 new Int32Array(data.buffer, …)を使用するのが最良の方法ですが、奇妙なオフセットがある場合は、適切に整列された2番目のバッファを使用する必要があります。それでも、あなたはそれを手動でコピーする必要はありません、あなただけのslice methodを使用することができます。

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

あなたはdata同じバッファにInt32sにアクセスする必要がある場合、あなたはまた、DataViewを使用することができます。

関連する問題