【问题标题】:Uint8Array invalid typed array length for larger array bufferUint8Array 较大数组缓冲区的类型化数组长度无效
【发布时间】:2019-03-28 02:36:34
【问题描述】:

我正在通过以下方式将文件作为数组缓冲区读取:

reader.readAsArrayBuffer(myFile);

然后我将使用该数组缓冲区并尝试通过以下方式创建 Uint8Array:

reader.onload = e => {
  let arrayBuffer = new Uint8Array(e.target.result, 0, 
  e.target.result.byteLength);

我也试过了:

let arrayBuffer = new Uint8Array(e.target.result);

在这两种情况下,当我上传字节长度为 198873088 的文件时,它都可以正常工作。但是,当我尝试更大的 1564725248 文件时,我在第一种情况下得到以下信息:

Invalid typed array length: 1564725248

在第二种情况下:

Invalid typed array length: undefined

我认为上限是 2^32 - 1,即 42949672995,谁能解释为什么长度有问题?

【问题讨论】:

  • 根据this answer,它依赖于实现。你在什么系统上使用什么浏览器?
  • 我在 64 位 Windows 10 Enterprise 上使用 Chrome 版本 69.0.3497.100(官方构建)(32 位),内存为 16 GB
  • 我什至不认为浏览器 js 允许访问 ram 的演出......

标签: javascript arraybuffer typed-arrays


【解决方案1】:

在最新的 Chrome 版本 71.0.3578.98(官方构建)(64 位)中,我得到以下结果。在空白页上硬重新加载后执行的每个测试。

a=new Uint8Array(256*256*256*128) // Triggers Uncaught RangeError: Invalid typed array length: 2147483648
a=new Uint8Array(256*256*256*127) // Works, array length 2130706432

但更有趣的是,我可以触发“Aw, Snap”而不会出现异常。 :

a=new Uint8Array(256*256*256*127 + 64) // Doesn't work, triggers "Aw, Snap!" page

【讨论】:

    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 2016-10-14
    • 2016-12-19
    • 1970-01-01
    • 2019-12-28
    • 2014-10-01
    • 2017-07-28
    • 2014-12-31
    相关资源
    最近更新 更多