pako javascript gzip zlib decompression tmx

pako - Descomprime gzip y la cadena zlib en javascript



pako deflate js (3)

Para cualquier persona que use Ruby on Rails, que desee enviar datos codificados comprimidos al navegador, luego descomprimirlos mediante Javascript en el navegador, he combinado las dos respuestas excelentes en la siguiente solución. Aquí está el código del servidor Rails en mi controlador de la aplicación que comprime y codifica una cadena antes de enviarlo al navegador a través de una variable a un archivo .html.erb :

require ''zlib'' require ''base64'' def compressor (some_string) Base64.encode64(Zlib::Deflate.deflate(some_string)) end

Aquí está la función de Javascript, que usa pako.min.js:

function uncompress(input_field){ base64data = document.getElementById(input_field).innerText; compressData = atob(base64data); compressData = compressData.split('''').map(function(e) { return e.charCodeAt(0); }); binData = new Uint8Array(compressData); data = pako.inflate(binData); return String.fromCharCode.apply(null, new Uint16Array(data)); }

Aquí hay una llamada de javascript a esa función de descompresión, que desea descodificar y descomprimir los datos almacenados dentro de un campo HTML oculto:

my_answer = uncompress(''my_hidden_field'');

Aquí está la entrada en el archivo de Rails application.js para llamar a pako.min.js , que está en el directorio / vendor / asset / javascripts :

//= require pako.min

Y obtuve el archivo pako.min.js desde aquí:

https://github.com/nodeca/pako/tree/master/dist

Todo funciona a mi final, de todos modos! :-)

Quiero obtener datos de la capa de compresión de tmx archivo. ¿Quién sabe las bibliotecas para descomprimir gzip y la cadena zlib en javascript? Intento zlib pero no funciona para mí. Ex, datos de capa en el archivo tmx es:

<data encoding="base64" compression="zlib"> eJztwTEBAAAAwqD1T20JT6AAAHgaCWAAAQ== </data>

Mi código javascript es

var base64Data = "eJztwTEBAAAAwqD1T20JT6AAAHgaCWAAAQ=="; var compressData = atob(base64Data); var inflate = new Zlib.Inflate(compressData); var output = inflate.decompress();

Se ejecuta con el mensaje de error muestra "método de compresión no compatible". Pero trato de descomprimir con la herramienta en línea como http://i-tools.org/gzip , devuelve la cadena correcta.


Puedo resolver mi problema por zlib . Arreglo mi código como abajo

var base64Data = "eJztwTEBAAAAwqD1T20JT6AAAHgaCWAAAQ=="; var compressData = atob(base64Data); var compressData = compressData.split('''').map(function(e) { return e.charCodeAt(0); }); var inflate = new Zlib.Inflate(compressData); var output = inflate.decompress();


Pako es un puerto Zlib completo y moderno.

Aquí hay un ejemplo muy simple y puedes trabajar desde allí.

Obtén pako.js y puedes descomprimir byteArray así:

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

Ejemplo de ejecución: http://jsfiddle.net/9yH7M/

Alternativamente, puede codificar en base64 la matriz antes de enviarla, ya que la Matriz tiene una gran sobrecarga cuando se envía como JSON o XML. Decodificar de la misma manera:

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

Ejemplo de ejecución: http://jsfiddle.net/9yH7M/1/

Para ir más avanzado, aquí está la documentación de la API de pako .