如何解析Uint8Array到对象?

时间:2014-10-06 20:46:02

标签: javascript parsing

我有一条消息payload,我想随意解析。前两个字节转到int16,下一个是float32,后两个是uint8,等等。它是一个序列化结构。

在Javascript中似乎没有明确的方法来解决这个问题。在C中,我可以将其转换为某种类型的结构,然后通过点表示法访问所有内容。

是否有可以轻松管理此类二进制对话的库?我想与python的construct库有某种平行?

1 个答案:

答案 0 :(得分: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)您可以使用每个类型化数组的完整构造函数访问包含Array的缓冲区的整个部分:

   var view = new *someTypedArray*(buffer, byteOffset, length)

通过这种方式,您可以轻松访问流的整个连贯部分。

(someTypedArray可以是:

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