我有一条消息payload
,我想随意解析。前两个字节转到int16,下一个是float32,后两个是uint8,等等。它是一个序列化结构。
在Javascript中似乎没有明确的方法来解决这个问题。在C中,我可以将其转换为某种类型的结构,然后通过点表示法访问所有内容。
是否有可以轻松管理此类二进制对话的库?我想与python的construct库有某种平行?
答案 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
)