“RangeError:无效的类型化数组长度”对于看似有效的输入

问题描述 投票:0回答:3

我有以下片段:

new Uint16Array( arraybuffer, 0, 18108 );

我知道

arraybuffer
ArrayBuffer的一个实例,而
arraybuffer.byteLength
是31984。arraybuffer的内容对我来说是一个黑盒子。因为缓冲区的 byteLength > 18108,所以我希望这能够正常工作。相反,我收到以下错误:

铬:

RangeError:类型化数组长度无效

火狐:

类型错误:无效参数

什么可能会导致失败,或者如何检查无法打开的 ArrayBuffer?

javascript arraybuffer typed-arrays
3个回答
14
投票

好吧,我误解了 TypedArray / Uint16Array 构造函数。第二个参数是

byteOffset
,但第三个参数是不是字节长度:它是元素长度。

来自 TypedArray 文档:

长度

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

由于

Uint16Array.BYTES_PER_ELEMENT
为 2,数组缓冲区需要至少
2 * 18108
字节长,但事实并非如此。


0
投票

我最近遇到了这个错误,所以我使用 ffmpeg 创建 wav 文件,所以我认为这是正确的格式。然后,你可以尝试用Python librosa或scipy打开并检查,我的问题是ffmpeg生成wav文件,但mp3layer格式,我需要转换为pcm格式。


0
投票

当我尝试打开 200 个文件并从其 ArrayBuffer 部分获取一些数据时,我也遇到了同样的问题。 20 个文件总是会导致错误

RangeError: Invalid typed array length: 262144
所以我使用
ArrayBuffer.slice(startByte, endByte)
解决了它 所以这个

new Int16Array( arraybuffer, byteOffset, byteLength/2 )

改成这样

new Int16Array( arraybuffer.slice( byteOffset, byteOffset + byteLength ) )

但是

slice
它创建了新的ArrayBuffer,所以你不能更改创建该数组的arraybuffer

© www.soinside.com 2019 - 2024. All rights reserved.