将不同数据类型的类型化数组合并为单个ArrayBuffer

3
我想知道是否有一种方法将不同类型的多个typed arrays合并成一个arraybuffer。目前我正在通过websockets发送二进制数据。但现在我只使用Uint8 Arrays。因此,我组装了一个新的Uint8Array([with、the、data、I、need]),并将此数组的缓冲区(Unint8Array.buffer)发送到服务器。但现在可能会发生需要一些Uint16或Float32数据的情况,这些数据混合在我的Uint8数据中。有没有办法实现这一点,以及如何实现。编辑:请求数据的长度未知,因为我必须动态组装请求。谢谢任何答复 :)

请参阅ArrayBufferView,以获取在任何特定偏移量处开始的相同数据的不同类型视图。 - jfriend00
1个回答

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以增加清晰度,但您也可以隐式地进行: 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,那么这不一定是一个问题,您只需要在相关的起始点创建视图,以便于(例如)缓冲区的其余长度。但是,您必须在写入后至少跟踪您所写内容的大小,以便于您知道在哪里继续处理其他数据。


嗯,看起来很有趣。但是你希望知道缓冲区的大小。有没有一种方法可以创建不同类型的TypedArrays的Arraybuffer?因此,如果我有一个Uint8和一个Uint16数组,我可以将它们“连接”到单个缓冲区中吗? - Fidel90
@Fidel90:你只需要创建一个足够大的ArrayBuffer(var buf = new ArrayBuffer(yourInt8Array.buffer.length + yourInt16Array.buffer.length);),然后将这些类型化数组复制到其中即可。 - T.J. Crowder
非常感谢,我想现在我更理解了。我会继续尝试的。祝你有美好的一天 :) - Fidel90

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接