Pytanie Dekompresja ZLIB - strona klienta


Otrzymuję dane jako "ZLIB"skompresowany strumień wejściowy.

Używając Javascript / Ajax / JQuery, muszę zdekompresować go po stronie klienta.

Czy jest jakiś sposób na zrobienie tego? Proszę pomóż.

Mam już działa w JAVA, jak poniżej, ale trzeba to zrobić po stronie klienta.

url = new URL(getCodeBase(), dataSrcfile); 
URLConnection urlConn = url.openConnection();
urlConn.setUseCaches(false); 
InputStream in = urlConn.getInputStream();
InflaterInputStream inflate = new InflaterInputStream(in);
InputStreamReader inputStreamReader = new InputStreamReader(inflate);
InputStreamReader inputStreamReader = new InputStreamReader(in);
BufferedReader bufReader = new BufferedReader(inputStreamReader);
// Read until no more '#'
int i = 0;
int nHidden = 0;
String line1;
do //------------------------Parsing Starts Here
{
    line1 = bufReader.readLine();
.............
...... so on

13
2017-12-22 08:14


pochodzenie


Czemu? Po prostu użyj kompresji HTTP, przeglądarka zajmie się tym przezroczyście. - Quentin
Co jeśli strona serwera już istnieje i nie można jej zmienić? Zgadzam się, że lepiej byłoby wykonać kompresję na poziomie HTTP. Ale nie zawsze masz wybór. - Codo
Czy próbowałeś skompilować kod C zlib do javascript? Wygląda na to, że Emscripten mógł to zrobić. - nside


Odpowiedzi:


Pako jest pełny i nowoczesny Zlib Port.

Oto bardzo prosty przykład, z którego możesz pracować.

Otrzymać pako.js i możesz rozpakować bajtArray w taki sposób:

<html>
<head>
  <title>Gunzipping binary gzipped string</title>
  <script type="text/javascript" src="pako.js"></script>
  <script type="text/javascript">

    // Get datastream as Array, for example:
    var charData    = [31,139,8,0,0,0,0,0,0,3,5,193,219,13,0,16,16,4,192,86,214,151,102,52,33,110,35,66,108,226,60,218,55,147,164,238,24,173,19,143,241,18,85,27,58,203,57,46,29,25,198,34,163,193,247,106,179,134,15,50,167,173,148,48,0,0,0];

    // Turn number array into byte-array
    var binData     = new Uint8Array(charData);

    // Pako magic
    var data        = pako.inflate(binData);

    // Convert gunzipped byteArray back to ascii string:
    var strData     = String.fromCharCode.apply(null, new Uint16Array(data));

    // Output to console
    console.log(strData);

  </script>
</head>
<body>
    Open up the developer console.
</body>
</html>

Przykład uruchomienia: http://jsfiddle.net/9yH7M/

Alternatywnie możesz base64 zakodować tablicę, zanim ją wyślesz, ponieważ Array ma dużo narzutów podczas wysyłania jako JSON lub XML. Dekoduj podobnie:

// Get some base64 encoded binary data from the server. Imagine we got this:
var b64Data     = 'H4sIAAAAAAAAAwXB2w0AEBAEwFbWl2Y0IW4jQmziPNo3k6TuGK0Tj/ESVRs6yzkuHRnGIqPB92qzhg8yp62UMAAAAA==';

// Decode base64 (convert ascii to binary)
var strData     = atob(b64Data);

// Convert binary string to character-number array
var charData    = strData.split('').map(function(x){return x.charCodeAt(0);});

// Turn number array into byte-array
var binData     = new Uint8Array(charData);

// Pako magic
var data        = pako.inflate(binData);

// Convert gunzipped byteArray back to ascii string:
var strData     = String.fromCharCode.apply(null, new Uint16Array(data));

// Output to console
console.log(strData);

Przykład uruchomienia: http://jsfiddle.net/9yH7M/1/

Aby przejść bardziej zaawansowane, oto jest pako Dokumentacja API.


15
2018-03-26 23:18



Dziękuję za konstruktywny komentarz na temat tego, dlaczego mój przykład pracy został wycofany. - Redsandro
Aby uzyskać ciąg z nieskompresowanych danych, możesz również wykonać następujące czynności: var strData = pako.inflate(binData, { to: 'string' });. Zobacz opcje tutaj: nodeca.github.io/pako/#inflate - Julien P


Nowsza oferta to https://github.com/imaya/zlib.js

Myślę, że jest o wiele lepszy niż alternatywy.


9
2017-09-14 20:09



Wolę korzystać z biblioteki z angielską dokumentacją, ta ma readme w pewnym języku azjatyckim, wygląda na japońską lub chińską. - Tener
Nie rozumiem, jak to ma znaczenie. Interfejs API jest jasny, jeśli znasz zlib. Ta biblioteka jest bardzo dobrze zaprojektowana, szybka i łatwa w użyciu. - user1009908
Angielska dokumentacja jest dostępna po kliknięciu łącza oznaczonego Dokumentacja angielska. - dotancohen


Nasza biblioteka JSXGraph zawiera algorytm deflate, unzip i gunzip. Proszę spojrzeć na jsxcompressor (spin-off z JSXGraph, patrz http://jsxgraph.uni-bayreuth.de/wp/download/) lub w pliku Utils.js w kodzie źródłowym.


3
2018-03-09 08:30





Tak jak sugerują pierwsze komentarze do twojego pytania, podejrzewam, że rzeczywiście chcesz, aby przeglądarka radziła sobie z dekompresją. Jeśli się mylę, możesz chcieć sprawdzić JSXGraph biblioteka, ma zawierać czystą Implementacje JS dla deflate i unzip.


2
2017-12-22 08:44



Dzięki za odpowiedź, ale jestem nieco zdezorientowany. Sprawdziłem JSXGraph, ale wygląda jak biblioteka do rysowania kształtów takich jak Arc, Circle itd. Czy chcesz mieć czysty HTML i JavaScript (bez PHP) przykład, w którym plik skompresowany przy pomocy Zlib może zostać un-compressed. Proszę pomóż - Rajeev Raina


The js-deflate projekt dankogai może być tym, czego szukasz. Właściwie to nie próbowałem, ale kod rawinflate.js wydaje się dość minimalny i powinien być w stanie rozpakować DEFLATE / zlib: ed data.


1
2018-04-25 20:20





Spróbuj pako https://github.com/nodeca/pako , nie jest to tylko nadmuchanie / deflate, ale dokładny port zlib do javascript, z prawie wszystkimi obsługiwanymi funkcjami i opcjami. Jest to także najszybsza implementacja w nowoczesnych przeglądarkach.


1
2018-03-15 19:33



Rewizja. Czy możesz podać przykład po stronie klienta (w tym, które pliki są wymagane)? Cała dokumentacja dotyczy użycia (po stronie serwera) node.js. - Redsandro


powinieneś zobaczyć zlib rfc z:zlib rfc

kod javascript nadmuchiwany testowałem:nadmuchać w JavaScript kod java, który napisałem:

    static public byte[] compress(byte[] input) {
    Deflater deflater = new Deflater();
    deflater.setInput(input, 0, input.length);
    deflater.finish();
    byte[] buff = new byte[input.length + 50];
    deflater.deflate(buff);

    int compressedSize = deflater.getTotalOut();

    if (deflater.getTotalIn() != input.length)
        return null;

    byte[] output = new byte[compressedSize - 6];

    System.arraycopy(buff, 2, output, 0, compressedSize - 6);// del head and
                                                                // foot byte
    return output;
}

Bardzo ważną rzeczą jest deflacja w Javie, musisz wyciąć 2 bajty głowy, 4 stopy stopy, aby uzyskać surowy deflate.


0
2018-04-18 03:47





Browserify-zlib działa idealnie dla mnie, używa pako i ma dokładnie taki sam api jak zlib. Po tym, jak przez wiele dni walczyłem z kompresowaniem / dekompresowaniem ładunków kodowanych zlib po stronie klienta za pomocą pako, mogę powiedzieć, że browserify-zlib jest naprawdę wygodny.


0
2018-05-15 13:03