JavaScript Zlib Dekomprimieren

9

Ich versuche, zlib'ed XML wie das folgende zu dekomprimieren: Ссылка

Das Hochladen auf Online-Dekomprimierungsdienste funktioniert wie: Ссылка

In PHP verwende ich diesen Code und funktioniert gut, ich bekomme die XML-Zeichenfolge:

%Vor%

Allerdings möchte ich das in JavaScript machen.

  • Die App ist eine clientseitige Chrome-Erweiterung, die chrome.devtools.network verwendet, von der gelesen wird Die Netzwerkprotokolle
  • Liest die binären Antworten. Beispiel bei Google Drive Link oben
  • JS muss diese Antwort auf ihre ursprüngliche XML-Datei dekomprimieren und anschließend in das Objekt
  • analysieren

Das einzige Problem, das ich habe, ist der zlib dekomprimieren Teil.

Ab dem neuesten Update funktionieren die Dekomprimierungsbibliotheken, das Entpacken jedoch nicht. Bitte gehen Sie zum Update 16. September unten.

Ich habe bereits mehrere JavaScript-Bibliotheken ausprobiert und kann immer noch nicht funktionieren:

Pako : Ссылка

unpack() code: Ссылка

%Vor%

Fehler: Uncaught incorrect header check

Es ist dasselbe, sogar die Antwort woanders zu platzieren:

  • new Uint8Array(response);
  • pako.inflate(response);

Imayas zlib : Ссылка

%Vor%

Fehler: Uncaught Error: unsupported compression method inflate.js:60

Immer noch mit Imayas zlib, kombiniert mit dieser Stack Overflow Frage: Dekomprimieren Sie gzip und zlib string in JavaScript

%Vor%

Fehler: Uncaught Error: invalid fcheck flag:29 inflate.js:65

dankogais js-deflate : Ссылка

%Vor%

Ausgabe: leer

Augusts js-inflates : Ссылка

%Vor%

Ausgabe: leer

zlib-browserify : Ссылка

Fehler: ReferenceError: exports is not defined

Dies ist nur ein Wrapper für Imayas zlib. Ich denke das ist requireJS ? Ich bin mir nicht einmal sicher, wie ich es benutzen soll. Kann es überhaupt verwendet werden, ohne etwas zu installieren und nur jQuery / JS? Die erwähnte App ist eine herunterladbare Chrome-Erweiterung mit nur HTML-Import von JS-Dateien.

UPDATE 16. September 2014

Das Problem scheint mit der Funktion JavaScript unpack( ) zu sein. Wenn ich das von PHP generierte ByteArray verwende: Ссылка , funktionieren die Dekomprimierungsfunktionen von JavaScript.

PHP Entpacken, das funktioniert:

%Vor%

Für den JavaScript unpack( ) Code, den ich benutze, der nicht funktioniert, siehe oben im Beitrag unter Pako .

Die neue Frage lautet also, warum JavaScript andere ByteArray-Werte erzeugt als die von PHP generierten.

  • Ist es wirklich ein Problem mit der Funktion unpack( ) ?
  • oder ist es etwas, wenn der JS die Datei holt, die Kodierung oder was auch immer ändert, dann werden die Bytes durcheinander gebracht?
  • und schließlich, was ist Ihr Vorschlag, zu beheben?

UPDATE 20. September 2014

Mit mehr Forschung und einigen Antworten gibt es hier Leads

  • Sebastian S die Idee, dass das Problem in der Art und Weise des Abrufs von Daten war und es hatte etwas mit Text-Kodierungen
  • zu öffnen
  • user3995789 liefert ein Beispiel dafür, dass es auch ohne die Funktion unpack( ) funktioniert, allerdings außerhalb des Kontexts der Chrome-Erweiterungen
  • Isaac bietet Beispiele im Zusammenhang mit Chrome-Erweiterungen, funktioniert aber immer noch nicht

Damit habe ich alle möglichen Leads zusammengeführt, die mich zu einer Theorie geführt haben, dass der Grund dafür ist, dass Chrome keine "rohen" Daten durch seine request.getContent -Funktion bekommen kann. Siehe für die Chrome-Dokumentation zu dieser Funktion.

Ab sofort habe ich das Problem in Chrome hier behandelt.

UPDATE 24. März 2015

Obwohl das Problem nicht vollständig gelöst wurde, war die Antwort, die ich für am nützlichsten hielt, @Sebastian S., der vorschlug, dass "der Weg", den ich gemacht habe oder die Daten erhalten habe, schuld sei und eine schlechte Konvertierung sei die Ursache, die so nah wie das Problem war.

    
dragonjet 05.09.2014, 08:21
quelle

3 Antworten

0

Meiner Meinung nach ist die Frage, die Sie wirklich stellen sollten: Wie rufen Sie die komprimierten Daten ab? Sobald es eine UTF-16-Zeichenfolge wird, beginnt das Problem. Ich bin mir nicht einmal sicher, ob die Konvertierung von rohen Bytedaten in JavaScript-Strings verlustfrei ist.

Da du etwas über PHP geschrieben hast, gehe ich davon aus, dass du mit irgendeiner Art von Backend kommunizierst. Wenn dies der Fall ist, gibt es Möglichkeiten, binäre Daten mit nativen Mitteln zu verarbeiten. Vielleicht kann Ihnen das helfen: Ссылка

    
Sebastian S 16.09.2014, 14:31
quelle
2

Jquery liest in utf8 Format, Sie müssen die Raw-Datei lesen, diese Funktion wird funktionieren.

%Vor%

Weitere Informationen finden Sie in dieser Antwort .

    
user3995789 16.09.2014 15:13
quelle
1

Ich habe verstanden, dass Sie die zlib-Dekomprimierung in einer Chrome-Erweiterung verwenden möchten, während Sie Antwortkörper aus dem Netzwerkprotokoll lesen.

Sie müssen zuerst das base64 abrufen, das dekomprimiert wird. Sie können dies erreichen, während Sie die Methode getContent verwenden.

%Vor%

Ссылка

Verwenden von XMLHttpRequest:

%Vor%

Wenn Sie XMLHttpRequest mit der Chrome-Erweiterung verwenden möchten

%Vor%

Ссылка

Fühlen Sie sich frei zu fragen, wenn Sie irgendwelche Fragen haben;)

    
Isaac 16.09.2014 15:51
quelle