Konvertieren von Arraybuffer in String: Maximale Größe des Call-Stacks überschritten

Lesezeit: 2 Minuten

Benutzeravatar von Suresh Atta
Sicher Atta

Das ist mein Code.

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();

Diese Anfrage wird an eine PDF-URL gestellt, die etwa 3 MB groß ist. Ich habe ein paar Threads mit dem gleichen Fehler gelesen, Maximale Call-Stack-Größe überschritten, der mir sagt, dass es einen rekursiven Aufruf geben muss, aber ich sehe hier keinen rekursiven Aufruf. Kann jemand helfen?

  • Geht diese Anfrage auf dieselbe Seite? Verwenden von GET on window.location.href?

    – skobaljic

    18. Juli 2016 um 9:16 Uhr

  • @skobaljic Ja. Zum Beispiel ist die aktuelle Seite cs.columbia.edu/~lok/3101/lectures/02-corejava.pdf

    – Suresh Atta

    18. Juli 2016 um 9:19 Uhr

  • Wenn Sie dieselbe Seite mit demselben Skript aufrufen, warum wundern Sie sich dann, dass es zu viele Rekursionen gibt? Versuchen Sie, eine andere Seite ohne Skript aufzurufen. Oder wenn Sie über xhr aufrufen, geben Sie das Skript nicht erneut aus oder fügen Sie Parameter hinzu, um den Aufruf zu unterscheiden.

    – skobaljic

    18. Juli 2016 um 10:27 Uhr


  • @skobaljic Dieses Skript wird in der Ladefunktion nicht ausgeführt. Ich lese gerade die PDF-Seitendaten.

    – Suresh Atta

    18. Juli 2016 um 10:29 Uhr

  • Haben Sie versucht, eine andere Seite oder ein anderes PDF zu laden?

    – skobaljic

    18. Juli 2016 um 10:30 Uhr


Ich hatte das gleiche Problem und habe schließlich diesen Code verwendet:

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 );
}

  • könnte benutzen reduce stattdessen, aber das scheint notwendig zu sein

    – Garr Godfrey

    5. November 2020 um 18:24 Uhr

  • Dies sollte die akzeptierte Antwort sein. klappt wunderbar

    – nächst

    11. November 2020 um 12:42 Uhr

Benutzeravatar von le_m
le_m

Der Fehler wird durch eine Begrenzung der Anzahl der Funktionsargumente verursacht. Siehe „RangeError: Maximale Call-Stack-Größe überschritten“ Warum?

Anstatt String.fromCharCode.apply()verwenden Sie zB a TextEncoder. Siehe Uint8Array zum String in Javascript

  • Hi. Wie benutzt man die TextEncoder in meinem Fall? ich habe das var base64 = btoa(String.fromCharCode.apply(null, new Uint8Array(blob)));

    – Entw

    6. März 2018 um 3:45 Uhr

  • Ich habe eine separate Frage eröffnet

    – Entw

    6. März 2018 um 5:01 Uhr

  • Für eine binäre Zeichenfolge TextEncoder ist nutzlos, es unterstützt nicht Latin1 (es verwendet Windows−1252), erhalten Sie das defekte Ergebnis. (new TextDecoder("ISO-8859-1").decode(new Uint8Array([148]))).charCodeAt(0); // 8221, sollte 148 sein

    – KeyKi

    17. März 2020 um 17:00 Uhr

this.response.arrayBuffer()
              .then((buf) => {
                const uint8Array = new Uint8Array(buf);
                const data = uint8Array.reduce((acc, i) => acc += String.fromCharCode.apply(null, [i]), '');
                return data;
              })

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;
    }

1438210cookie-checkKonvertieren von Arraybuffer in String: Maximale Größe des Call-Stacks überschritten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy