Float32Array
將在內部表示基於主機系統永恆性的值,通常是小端。
是的,格式是IEEE 754(這已經出現在FPU出現之前,並且它的變化處理更多的寬度,即64位,80位等)。 JavaScript中的所有數字(Number
)在內部都表示爲64位IEEE 754.對於類型化數組,32位和64位IEEE 754當然可用。
PowerPC和68k CPU使用big-endian(它應該是!:)的方式)。所謂的網絡順序也是大端的,許多與平臺無關的文件格式以大端字節順序存儲(尤其是音頻和圖形)。大多數主流電腦都使用x86這樣的小端CPU。所以在這些情況下,你很可能不得不處理不同的字節順序。
要處理這種情況,您可以不使用Float32Array,而使用DataView。
例如:
var buffer = new ArrayBuffer(10240); // some raw byte buffer
var view = new DataView(buffer); // flexible view supporting endianness
現在,你現在可以讀取並牢記字節順序寫入任何位置在緩衝區(數據視圖還允許讀/ /寫入到非對齊位置,即。如果需要,可以將Float32值寫入位置3,但不能使用Float32/Uint32/Int16等)。
瀏覽器將在內部轉換爲正確的順序 - 你只是提供價值-是:閱讀時
view.setFloat32(pos, 0.5); // big-endian
view.setFloat32(pos, 0.5, false) // big-endian
view.setFloat32(pos, 0.5, true); // little-endian
而且同樣:
var n = view.getFloat32(pos); // big-endian
var n = view.getFloat32(pos, false) // big-endian
var n = view.getFloat32(pos, true); // little-endian
提示:您可以使用原生Float32Array內部使用Endianess進行讀取/寫入。這往往是速度更快,但它需要使用數據視圖在最後轉換,如果得到的緩衝區的字節順序是從主機系統不同:
var f32 = new Float32Array(buffer); // or use a size
f32[0] = 0.5;
然後確保你有大端表示:
希望給予一些投入!如果你想讓我詳細說明一些部分,只需向我提出問題。
來源
2015-03-31 00:02:48
K3N