如何将带偏移量的Uint8Array转换为Int32Array

How can I convert a Uint8Array with offset into an Int32Array?

本文关键字:Uint8Array 转换 Int32Array 偏移量      更新时间:2024-03-08

我有一个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.buffer, …)是最好的方法,但如果您有一个奇怪的偏移,则需要使用第二个正确对齐的缓冲区。不过,您不必手动复制,只需使用slice方法即可:

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

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