【问题标题】:Merging typed arrays of different data type into a single arraybuffer将不同数据类型的类型化数组合并到单个数组缓冲区中
【发布时间】:2014-10-01 13:54:28
【问题描述】:

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

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

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

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

感谢您的回复:)

【问题讨论】:

  • 请参阅ArrayBufferView,了解从任何特定偏移量开始的相同数据的不同类型视图。

标签: javascript arrays websocket binary typed-arrays


【解决方案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,这不一定是问题,您只需要在相关起点为(例如)缓冲区的其余长度创建视图。但是您必须至少在编写完之后跟踪您所写的内容有多大,这样您就知道在哪里继续处理其他数据。

【讨论】:

  • 嗯,这看起来很有趣。但是您希望知道缓冲区的大小。有没有办法创建不同 TypedArrays 的 Arraybuffer?因此,如果我有一个 Uint8 和一个 Uint16 数组,我可以将它们“连接”到一个缓冲区?
  • @Fidel90:您只需创建一个足够大的 ArrayBuffer 以容纳两者 (var buf = new ArrayBuffer(yourInt8Array.buffer.length + yourInt16Array.buffer.length);),然后将类型化数组复制到其中。
  • 非常感谢,我想我现在明白了很多。我会继续尝试这个。祝你有美好的一天:)
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多