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
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.
plus récente offrande est https://github.com/imaya/zlib.js
je pense que c'est beaucoup mieux que les solutions de rechange.
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.
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.
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.
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.
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.
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.