javascript - Uint8Array 较大数组缓冲区的类型化数组长度无效
问题描述
我正在通过以下方式将文件作为数组缓冲区读取:
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,谁能解释为什么长度有问题?
解决方案
在最新的 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
推荐阅读
- databricks - 删除 Databricks Notebook 的所有单元格
- python - 使用 Python 将英文单词转换为数字向量
- authentication - 如何将 UWP 应用的身份验证从 OneDrive SDK 迁移到 Graph
- javascript - JavaScript:检测层次图中的循环
- python - 如何在 R/Python 中从 GPS 数据集中检测停止点
- r - R:使用 eval() 的 dbplyr
- excel - 宏中的计数
- python - 我想从我的最后一行之后检测圆圈并指定它的位置
- javascript - 如何在Vue3.0中通过双击打开或关闭自动播放?
- pascal - 致命:语法错误,; 预期但发现标识符 TUNJANGAN