2016-04-07 69 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位整數。

通過傳遞偏移也不起作用,我得到的錯誤嘗試它「的RangeError:Int32Array開始偏移應該是4的倍數」:

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

手動複製每個字節的唯一從偏移量Int8Array中獲取Int32Array的方法?

+0

順便說一句,如果你使用'new Int32Array(data)',它會將'Uint8'從'data'讀入'Int32',即緩衝區大小的四倍。 – Bergi

回答

3

不,您不需要手動將字節從一個字節複製到另一個陣列。使用new Int32Array(data.buffer, …)是最好的方法,但是如果你有一個奇怪的偏移量,你將需要使用第二個正確對齊的緩衝區。不過,您不必手動複製它,你可以只使用slice method

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

如果您需要在同一緩衝訪問Int32s爲data,你也可以使用一個DataView

相關問題