ZLIB Decompression - Client Side

后端 未结 8 841
孤街浪徒
孤街浪徒 2020-12-05 01:29

I am receiving data as an \"ZLIB\" compressed inputstream.

Using Javascript/Ajax/JQuery, I need to uncompress it on the client side.

Is the

相关标签:
8条回答
  • 2020-12-05 01:53

    Just as the first comments to your question suggest, I would suspect that you actually want the browser to handle the decompression. If I am mistaken, you might want to check out the JSXGraph library, it is supposed to contain pure JS implementations for deflate and unzip.

    0 讨论(0)
  • 2020-12-05 01:55

    Pako is a full and modern Zlib port.

    Here is a very simple example and you can work from there.

    Get pako.js and you can decompress byteArray like so:

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

    Running example: http://jsfiddle.net/9yH7M/

    Alternatively you can base64 encode the array before you send it over as the Array takes up a lot of overhead when sending as JSON or XML. Decode likewise:

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

    Running example: http://jsfiddle.net/9yH7M/1/

    To go more advanced, here is the pako API documentation.

    0 讨论(0)
提交回复
热议问题