Zlib décompression-côté Client

je reçois des données comme un " ZLIB" compressé inputstream.

en utilisant Javascript / Ajax / JQuery, je dois le décompresser du côté du client.

Est-il un moyen de le faire? S'il vous plaît aider.

j'ai déjà ceci qui fonctionne en JAVA comme ci-dessous, mais j'ai besoin de le faire du côté Client.

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
demandé sur Daenyth 2010-12-22 11:14:53

8 réponses

Enseigne est un complet et moderne Zlib port.

Voici un exemple très simple et vous pouvez travailler à partir de là.

Get pako.js et vous pouvez décompresser byteArray comme suit:

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

exemple D'exécution:http://jsfiddle.net/9yH7M/

vous pouvez aussi Base64 Encoder le tableau avant de l'envoyer car le tableau prend beaucoup de place lors de l'envoi en JSON ou XML. Décoder de la même manière:

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

exemple D'exécution:http://jsfiddle.net/9yH7M/1/

Pour aller plus avancé, voici le pako documentation API.

15
répondu Redsandro 2014-03-26 23:49:34

plus récente offrande est https://github.com/imaya/zlib.js

je pense que c'est beaucoup mieux que les solutions de rechange.

9
répondu user1009908 2012-09-14 20:09:57

notre bibliothèque JSXGraph contient l'algorithme deflate, unzip et gunzip. S'il vous plaît, jetez un oeil à jsxcompressor (un spin-off de JSXGraph, reportez-vous à http://jsxgraph.uni-bayreuth.de/wp/download/) ou à Utils.js dans le code source.

3
répondu Alfred Wassermann 2011-03-09 08:30:47

tout comme les premiers commentaires à votre question suggèrent, je soupçonne que vous voulez réellement le navigateur pour gérer la décompression. Si je me trompe, vous pourriez vouloir vérifier le JSXGraph bibliothèque, il est censé contenir pure implémentations JS pour deflate et unzip.

2
répondu cg. 2010-12-22 08:44:57

js-deflate le projet de dankogai peut être ce que vous recherchez. Je n'ai pas vraiment essayé, mais le rawinflate.le code js semble assez minime, et devrait pouvoir décompresser les données DEFLATE/zlib:ed.

1
répondu marcus256 2011-04-25 20:20:28

Try pako https://github.com/nodeca/pako, ce n'est pas seulement gonfler/dégonfler, mais le port exact de zlib à javascript, avec presque toutes les fonctionnalités et les options prises en charge. En outre, c'est l'implémentation la plus rapide dans les navigateurs modernes.

1
répondu Vitaly 2014-03-15 19:33:27

vous devriez voir zlib rfc: zlib rfc

le javascript gonfle le code que j'ai testé: gonfler en Javascript le code java que j'ai écrit:

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

la chose très importante est en deflate en Java vous devez couper la tête 2 byte, pied 4 byte, pour obtenir le deflate brut.

0
répondu summer 2011-04-18 03:47:04

Browserify-zlib fonctionne parfaitement pour moi, il utilise pako et a exactement la même api que zlib. Après que j'ai lutté pendant des jours avec la compression/décompression zlib charges encodées côté client avec pako, je peux dire que browserify-zlib est vraiment pratique.

0
répondu Tanguy Snoeck 2018-05-15 13:03:32