【问题标题】:How can I convert a Uint8Array with offset into an Int32Array?如何将带有偏移量的 Uint8Array 转换为 Int32Array?
【发布时间】:2016-04-07 08:53:50
【问题描述】:

我有一个带有偏移量的 Uint8Array,它是从另一个函数接收到的。这包含了我需要的数据,但是在缓冲区的开头还有一些其他的东西支持这个类型化的数组。

实际数据是 32 位整数,我希望将这些数据放在 Int32Array 中。但是转换这似乎并不简单,我目前正在通过以下方式手动进行:

var outputBuffer = new ArrayBuffer(data.length);
  var inputByteArray = new Uint8Array(outputBuffer);
  for (var i=0; i < data.length; ++i) {
    inputByteArray[i] = data[i]
  }
  var outputInt32Array= new Int32Array(outputBuffer);

仅仅创建一个新的 Int32Array 并传递源 Uint8Array 的直接方法是行不通的:

var outputInt32Array = new Int32Array(data) // data is the Uint8Array with offset

这会产生一个类型化数组,它的行为仍然像 Uint8Array 并分发单个字节,而不是 32 位整数。

通过传入偏移量尝试它也不起作用,我收到错误“RangeError: Int32Array 的起始偏移量应该是 4 的倍数”:

var outputInt32Array = new Int32Array(data.buffer, data.byteOffset, length)

手动复制每个字节是从带偏移量的 Int8Array 中获取 Int32Array 的唯一方法吗?

【问题讨论】:

  • 顺便说一句,如果你使用new Int32Array(data),它会将data 中的每个Uint8 读入Int32,即将缓冲区的大小增加四倍。

标签: javascript typed-arrays


【解决方案1】:

不,您不需要手动将字节从一个数组复制到另一个数组。使用new Int32Array(data.buffer, …) 是最好的方法,但是如果您有一个奇怪的偏移量,您将需要使用正确对齐的第二个缓冲区。不过,您不必手动复制它,只需使用slice method

var outputInt32Array = new Int32Array(data.buffer.slice(data.byteOffset), 0, length);

如果您需要访问与data 相同的缓冲区上的Int32s,您也可以使用DataView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 2022-11-22
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多