将不同数据类型的类型化数组合并到单个arraybuffer中

时间:2014-08-08 06:49:44

标签: javascript arrays websocket binary typed-arrays

我想知道是否有一种方法可以将多个不同类型的类型数组合并到一个数组缓冲区中。

目前我正通过websockets将二进制数据发送到服务器。但现在我只使用Uint8 Arrays。所以我组装了一个新的Uint8Array([with,the,data,I,need])并将该数组的缓冲区(Unint8Array.buffer)发送到服务器。

但现在可能会发生,我的请求中需要一些Uint16或Float32数据,混合在我的Uint8数据中。有没有办法实现这个以及如何实现。

编辑:请求数据的长度未知,因为我必须动态组合请求。

感谢您的回复:)

1 个答案:

答案 0 :(得分:1)

是的,你可以这样做,这就是为什么类型数组将数组与存储内容的缓冲区分开的原因。这里是缓冲区的两个视图的示例,一个包含字节和一个单词:Live Copy

// Create the buffer
var buf = new ArrayBuffer(10);

// Create a byte view of it
var a8 = new Int8Array(buf);

// Create a word view of it
var a16 = new Int16Array(buf, 2, 2);

// Set a couple of words
a16[0] = 0x1221;
a16[1] = 0x2442;

// Show the contents of the byte array
var i;
for (i = 0; i < a8.length; ++i) {
  console.log("0x" + a8[i].toString(16));
}

输出:

0x0
0x0
0x21
0x12
0x42
0x24
0x0
0x0
0x0
0x0

为了清晰起见,我已明确创建了ArrayBuffer,但您也可以隐式地 im Live Copy(相同的输出)

// Create a byte view and underlying buffer
var a8 = new Int8Array(10);

// Create a word view of the byte view's buffer
var a16 = new Int16Array(a8.buffer, 2, 2);

// Set a couple of words
a16[0] = 0x1221;
a16[1] = 0x2442;

// Show the contents of the byte array
var i;
for (i = 0; i < a8.length; ++i) {
  console.log("0x" + a8[i].toString(16));
}
  

编辑:请求数据的长度未知,因为我必须动态组合请求。

如果你已经分配了足够大的ArrayBuffer,这不一定是个问题,你只需要在相关的起始点创建视图(例如)缓冲区长度的其余部分。但是,您必须在之后编写它之后跟踪您所写的内容有多大,以便您知道在哪里继续使用其他数据。< / p>