2014-10-06 187 views
0

我有一個消息​​,我想任意解析。前兩個字節是int16的,下一個是float32,後兩個是uint8's,這是一個序列化結構。如何解析Uint8Array到對象中?

在Javascript中似乎沒有明確的方法去解決這個問題。在C中,我可以將它作爲特定類型的結構體,然後通過點符號訪問所有內容。

有沒有一個庫可以方便地管理這種二進制對話?我正在考慮與python的construct庫平行嗎?

+0

你是詢問如何實現這樣的(我認爲你正在尋找['DataView's(https://開頭開發商.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView)),還是尋找完整的庫,允許聲明式解析,就像你提到的'construct'一樣? – Bergi 2014-10-06 21:06:38

+0

我在問如何實現,希望有人會使用一個庫。 – tarabyte 2014-10-06 21:47:00

回答

1

鍵入數組提供了相當多種功能來輕鬆解碼緩衝區。

教程 http://www.html5rocks.com/en/tutorials/webgl/typed_arrays/

規格: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays

不久,你有兩種方式訪問​​緩衝區:

1)您可以通過DataView創建存取的ArrayBuffer訪問它: 你可以使用getInt(position)或getFloat32(position)來檢索任意位置的int/float。

(例如,從HTML5ROCKS)

var dv = new DataView(buffer); 
var vector_length = dv.getUint8(0); 
var width = dv.getUint16(1); // 0+uint8 = 1 bytes offset 
var height = dv.getUint16(3); // 0+uint8+uint16 = 3 bytes offset 
var vectors = new Float32Array(width*height*vector_length); 
for (var i=0, off=5; i<vectors.length; i++, off+=4) { 
    vectors[i] = dv.getFloat32(off); 
} 

或2)可以訪問,通過使用每個類型數組的完整構造包含一個數組該緩衝器的整個部分:

這您可以輕鬆訪問流的整個連貫部分。

(其中someTypedArray可以是:

Float64Array, Float32Array, Int32Array, Int16Array, Int8Array, 
Uint32Array, Uint16Array, Uint8Array, Uint8ClampedArray