【问题标题】:Converting arraybuffer to string : Maximum call stack size exceeded将数组缓冲区转换为字符串:超出最大调用堆栈大小
【发布时间】:2016-07-18 09:04:52
【问题描述】:

这是我的代码。

var xhr = new XMLHttpRequest();
xhr.open('GET',window.location.href, true);
xhr.responseType = "arraybuffer";
xhr.onload = function(event) {
 debugger;
 console.log(" coverting array buffer to string "); 
 alert(String.fromCharCode.apply(null, new Uint8Array(this.response)));
};
xhr.send();

正在向大小约为 3 MB 的 PDF URL 发出该请求。我已经阅读了一些具有相同错误的线程,超出了最大调用堆栈大小,告诉我必须有一些递归调用,但我在这里看不到任何递归调用。有人可以帮忙吗?

【问题讨论】:

  • 这个请求是否指向同一个页面?在window.location.href上使用GET?
  • @skobaljic 可以。比如当前页面是cs.columbia.edu/~lok/3101/lectures/02-corejava.pdf
  • 如果您调用包含相同脚本的同一页面,为什么您会怀疑递归过多?尝试在没有脚本的情况下调用其他页面。或者如果您通过 xhr 调用,则不要再次输出脚本,或者添加参数以区分调用。
  • @skobaljic 这个脚本不会在加载函数中执行。我只是在阅读pdf页面数据。
  • 您是否尝试加载其他页面,其他 pdf?

标签: javascript jquery encoding data-conversion arraybuffer


【解决方案1】:

我也遇到了同样的问题,终于用this code:

function _arrayBufferToBase64( buffer ) {
    var binary = '';
    var bytes = new Uint8Array( buffer );
    var len = bytes.byteLength;
    for (var i = 0; i < len; i++) {
        binary += String.fromCharCode( bytes[ i ] );
    }
    return window.btoa( binary );
}

【讨论】:

  • 可以改用reduce,但这似乎是必要的
  • 这应该是公认的答案。像魅力一样工作
【解决方案2】:
Thank you so much Anthony O, you saved my 10 days work.
small modification in my scenario is:

Angular 7 :

/** Convert Uint8Array to string */

    private static arrayBufferToBase64( buffer: Uint8Array ) {
        var binary = '';
        var bytes = new Uint8Array( buffer );
        var len = bytes.byteLength;
        for (var i = 0; i < len; i++) {
            binary += String.fromCharCode( bytes[ i ] );
        }
        return  binary;
    }

【讨论】:

  • 请不要添加“谢谢”作为答案。相反,请为您认为有帮助的答案投票。
【解决方案3】:

该错误是由函数参数数量限制引起的。见"RangeError: Maximum call stack size exceeded" Why?

使用 e 代替 String.fromCharCode.apply()。 G。 TextEncoder。见Uint8Array to string in Javascript

【讨论】:

  • 嗨。在我的情况下,您如何使用TextEncoder?我有这个var base64 = btoa(String.fromCharCode.apply(null, new Uint8Array(blob)));
  • 我开了一个单独的question
  • 对于二进制字符串TextEncoder是没用的,它不支持Latin1(它使用Windows−1252),你会得到损坏的结果。 (new TextDecoder("ISO-8859-1").decode(new Uint8Array([148]))).charCodeAt(0); // 8221,应该是 148
【解决方案4】:
this.response.arrayBuffer()
              .then((buf) => {
                const uint8Array = new Uint8Array(buf);
                const data = uint8Array.reduce((acc, i) => acc += String.fromCharCode.apply(null, [i]), '');
                return data;
              })

【讨论】:

    猜你喜欢
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2015-12-29
    • 2017-12-27
    • 2020-12-06
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多