2012-11-10 84 views
1

當涉及到排序時,JavaScript Typed Arrays會造成危險。使JavaScript的類型化數組「最終安全」的最佳實踐是什麼?

假設你有這樣的功能:

var encodeFloat32 = (function() { 
    var arr = new Float32Array(1); 
    var char = new Uint8Array(arr.buffer); 
    return function(number) { 
    arr[0] = number; 
    return String.fromCharCode(char[0], char[1], char[2], char[3]); 
    }; 
}()); 

這是,如果你是Big Endian的系統上運行它由於您提交ArrayBuffers字節的順序有潛在危險的功能「fromCharCode」方法。

因此,您需要創建某種endian安全性,以使代碼與平臺無關。

在用JavaScript編寫的應用程序中創建「endian安全」的最佳實踐是什麼?有沒有解決方法?

回答

1

根據這個帖子字節序是安全的JavaScript

JavaScript Endian Encoding?

看那DataView對象(仍處於草案),因爲它提供了一個littleEndian boolean

+2

我相信這篇文章是在Typed Arrays抵達JavaScript之前發佈的。它解釋了位移是endian安全的,但我認爲它不適用於Typed Arrays。 – Willem

+0

DataView看起來很有希望,但我不確定您將如何使用它來實現endian安全。 – Willem

+0

我的假設是,如果您總是通過DataView讀取/寫入值,您可以「忽略」平臺的永久性。 (再次這是一個假設,我沒有什麼可以證明它)這篇文章可能會有所幫助http://stackoverflow.com/a/7876265/149636 – lostsource

1

其前人的精力是你的要求非常有用我在javascript中使用這樣的函數來首先檢查(我設置字符串的效果,我通常只是使用布爾或類似):

function checkEndian(){ 
    var a = new ArrayBuffer(4); 
    var b = new Uint8Array(a); 
    var c = new Uint32Array(a); 
    b[0] = 0xa1; 
    b[1] = 0xb2; 
    b[2] = 0xc3; 
    b[3] = 0xd4; 
    if(c[0] == 0xd4c3b2a1) return "little endian"; 
    if(c[0] == 0xa1b2c3d4) return "big endian"; 
    else throw new Error("Something crazy just happened"); 
}