【问题标题】:Converting array buffer to string - Maximum call stack size exceeded将数组缓冲区转换为字符串 - 超出最大调用堆栈大小
【发布时间】:2018-08-13 20:40:40
【问题描述】:

我们的应用下载了一个 zip 文件,但响应是二进制的。

所以我所做的就是将其转换为 base64。大小为87.7KB时有效,但响应大小为183KB时出错。

错误是Uncaught RangeError: Maximum call stack size exceeded

有问题的行是

btoa(String.fromCharCode.apply(null, new Uint8Array(blob)))

根据this answerString.fromCharCode.apply()必须替换为TextEncoder

所以我改成

btoa(new TextDecoder('utf-8').decode(new Uint8Array(blob)))

但我得到一个错误。

Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.

我用这个answer最上面的sn-p再次改变了它

现在是新代码

btoa(unescape(encodeURIComponent(new TextDecoder('utf-8').decode(new Uint8Array(blob)))))

现在可以下载,但下载的 zip 文件已损坏。

完整代码可见here

【问题讨论】:

  • 我已经对你之前的回答发表了评论,但这是一个X-Y问题,你真的不需要通过b64,甚至不需要通过AB。

标签: javascript binary


【解决方案1】:

我从另一个问题得到了答案

btoa(new Uint8Array(blob).reduce(function (data, byte) {
    return data + String.fromCharCode(byte);
}, ''));

Source

【讨论】:

  • 这段代码摆脱了最大堆栈大小错误,但我使用这个转换后的字符串来生成我可以在我的嵌入元素中用作 src 的 url。但它给了我 net::ERR_INVALID_URL 错误。这只发生在给出堆栈大小超出错误的 pdf 文件中。小的pdf文件工作得很好。请帮忙。
【解决方案2】:

https://stackoverflow.com/a/40077712/6582356

function blobToB64(data) {
    if ('TextDecoder' in window) {
      // Decode as UTF-8
      var dataView = new DataView(data);
      var decoder = new TextDecoder('utf8');
      return btoa(decoder.decode(dataView));
    } else {
      // Fallback
      return btoa(new Uint8Array(data).reduce((data, byte) =>
        data + String.fromCharCode(byte),
        ''))
    }
}

https://developer.mozilla.org/en-US/docs/Web/API/TextDecoder

这个似乎有更好的性能

【讨论】:

  • TextDecoder 示例不正确,因为它解码 UTF-8:blobToB64(new Uint8Array([240, 159, 152, 128]).buffer) Uncaught DOMException: Failed to execute 'btoa' on 'Window': 要编码的字符串包含Latin1 范围。 [240, 159, 152, 128] 是笑脸表情符号的代码。
  • @dchest 同意,使用 npmjs.com/package/js-base64 之类的东西代替 btoa 可以解决这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 2015-12-29
  • 2017-12-27
  • 2020-12-06
  • 1970-01-01
  • 2015-10-10
相关资源
最近更新 更多