“引发RangeError:无效类型数组长度”为看似-有效输入

Don*_*rdy 3 javascript typed-arrays arraybuffer

我有以下片段:

new Uint16Array( arraybuffer, 0, 18108 );
Run Code Online (Sandbox Code Playgroud)

我知道,arraybuffer是的一个实例ArrayBuffer,那arraybuffer.byteLength是31984.该arraybuffer的内容是一个黑盒子给我。因为缓冲区的byteLength> 18108,所以我希望它能正常工作。相反,我得到以下错误:

铬:

RangeError:无效的类型化数组长度

Firefox:

TypeError:无效的参数

是什么原因导致失败,或者如何检查无法打开的ArrayBuffer?

Don*_*rdy 5

好吧,我误解了TypedArray / Uint16Array构造函数。第二个参数是a byteOffset,但第三个参数不是字节长度:它是元素长度。

来自TypedArray文档:

长度

当使用length参数调用时,将在大小为长度乘以包含0值的BYTES_PER_ELEMENT字节的内存中创建内部数组缓冲区。

由于Uint16Array.BYTES_PER_ELEMENT为2,因此arraybuffer的长度至少应为2 * 18108字节长,而实际上不是。