javascript - style - title css
JavaScript: Descomprimir/inflar/descomprimir/descomprimir cadenas (7)
Estoy buscando la implementación de JavaScript de algoritmos de inflado de cadenas. Quiero comprimir en el lado del servidor (Java) y descomprimir en el lado del cliente (JavaScript).
He encontrado:
descomprimir cadenas en javascript
Ese es marcado como respondido con una respuesta para un problema diferente. Otras respuestas son también para otra cosa (descomprimir archivos en formato ZIP).
Implementación de inflar JavaScript (posiblemente solo FF 3.6)
Esto es lo más cercano a lo que necesito. Sin embargo, me gustaría tener algunas alternativas.
Sugerencias?
Gracias, Ondra
Actualización: tengo un caso de uso bastante específico, por favor no responda "No hagas eso en JavaScript". Estoy escribiendo una herramienta de informes "fuera de línea" (una vez generada, se coloca en una tienda estática) y desinflar puede ahorrar megabytes para un solo informe. Estoy limitado por otras aplicaciones, así que no puedo almacenarlo como un archivo zip.
Eche un vistazo a esta pregunta de Desbordamiento de pila , las respuestas allí contienen referencias a múltiples motores de compresión implementados en javascript. La mayoría de estos se basan en LZ77.
Encontré una implementación de inflado que funciona aquí:
http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt
Si desea una versión ligeramente más limpia que los espacios de nombres del algoritmo, este debería funcionar:
https://github.com/augustl/js-inflate
Tenga en cuenta que los datos "hinchados" con gzip llevan como prefijo un encabezado de dos bytes y tienen un sufijo de suma de comprobación de cuatro bytes, que deberá quitar antes de pasar al algoritmo.
Este ejemplo: http://cheeso.members.winisp.net/srcview.aspx?dir=js-unzip muestra cómo se pueden hacer los archivos ZIP en Javascript. Ahora, sé que quieres compresión ZLIB o DEFLATE, en lugar de ZIP. Pero, ZIP usa DEFLATE, y dentro del archivo .js para ese ejemplo, hay una clase InflatingReader que puede INFLAR a medida que lee.
La clase expone estos métodos:
readByte()
returns null when EOF is reached, or the value of the byte when successful.
readToEnd()
returns an array of all bytes read, to EOF
beginReadToEnd(callback)
async version of the above
readBytes(n)
returns an array of n bytes read from the source.
beginReadBytes(n, callback)
async version of the above
Puede usar ese código sin cambios si quiere INFLATE .
Si quieres ZLIB (también conocido como descomprimir), hay una firma de 2 bytes que debes leer y validar antes de leer los bytes comprimidos y hacer INFLATE. Simplemente modifique el InflatingReader para leer y volcar 2 bytes, y hará bien ZLIB.
No hagas eso en JavaScript. Sería lento y, además, a JS no le va bien con los datos binarios.
Simplemente use la codificación de transferencia gzip en el lado del servidor y su navegador se encargará de descomprimirlo.
No sé cómo te gustaría, pero me gustan estas implementaciones:
El primero es el más rápido que el segundo. Por lo general, podemos garantizar un servidor rápido, sin embargo, no conocemos el rendimiento de la máquina cliente. Por lo tanto, le recomiendo que elija js-deflate y ajuste su java (lado del servidor) para inflar.
existe esta biblioteca gráfica que tiene como parte de ella una implementación zlib en javascript. si te desplazas un poco hacia abajo en esta página, la verás como una descarga separada. http://jsxgraph.uni-bayreuth.de/wp/download/
Creé un ejemplo de trabajo usando pako
, puerto Zlib
moderno y rápido. http://jsfiddle.net/9yH7M/2/