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

时间:2016-04-07 08:53:51

标签: javascript typed-arrays

我有一个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位整数。

通过传入偏移来尝试它也不起作用,我得到错误&#34; RangeError:Int32Array的起始偏移量应该是4的倍数&#34;:

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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