2011-02-02 15 views
29

Estoy buscando la implementación de JavaScript de los algoritmos de inflado de cadenas. Quiero comprimir en el lado del servidor (Java) y descomprimir en el lado del cliente (JavaScript).JavaScript: Descomprimir/inflar/descomprimir/descomprimir cadenas

he encontrado:

unzip strings in javascript
Que uno se marca como respondida con una respuesta para diferentes problemas. Otras respuestas son también para otra cosa (descomprimir archivos en formato ZIP).

JavaScript inflate implementation (possibly FF 3.6 only)
Esto es lo más cercano a lo que necesito. Sin embargo, me gustaría tener algunas alternativas.

Sugerencias?
Gracias, Ondra

Actualización: tengo absolutamente un caso de uso específico, por favor no conteste "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 guardar megabytes para un solo informe. Estoy limitado por otras aplicaciones, así que no puedo almacenarlo como un archivo zip.

+3

El principal problema es que JavaScript no tiene instalaciones para manipular datos brutos. Todos los números son de coma flotante y todos los valores de cadena se guardan como UTF-16 (caracteres de 2 bytes). No hay ningún tipo de datos de "matriz de bytes", por lo que hace que la implementación de compresión/descompresión sea mucho más difícil y mucho menos eficiente. – Pointy

+4

No es cierto, hay soporte para datos binarios en implementaciones de JavaScript recientes, en base a [Especificación de matriz tipada] (http://www.khronos.org/registry/typedarray/specs/latest/). –

+0

sí, eso es cierto, eso sin duda sería útil :-) – Pointy

Respuesta

9

Eche un vistazo a this Stack Overflow question, las respuestas allí contienen referencias a múltiples motores de compresión implementados en javascript. La mayoría de estos se basan en LZ77.

-4

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.

+11

No estoy preguntando si es bueno o malo. Estoy buscando implementaciones. -1. –

+4

Es un muy buen consejo, @Ondra. Si desea hacer algo que se considera una "mala idea" por muchas personas con experiencia, debe explicar sus razones. – Pointy

+3

@Pointy: No estoy de acuerdo. Por supuesto, tienes razón, pero si alguien está pidiendo algo poco ortodoxo, probablemente no sea lo mejor solo agitar un dedo, sin importar la experiencia. – jAndy

9

No sé cómo le gustaría eso, pero me gustan estas implementaciones:

El primero es más rápido que el segundo, por lo general podemos garantizar un servidor rápido, sin embargo no sabemos el rendimiento de la máquina del cliente Por lo tanto, le recomiendo que elija js-deflate y ajuste su java (lado del servidor) para inflar.

https://github.com/dankogai/js-deflate

http://code.google.com/p/gzipjs/

+3

La segunda url (gzipjs) no tiene ningún código publicado en ningún lado ... ¿o me falta algo? –

+1

Este debería ser el tipo de respuesta aceptado. – almosnow

+0

He estado buscando por horas ahora, salté esta respuesta la primera vez, pero realmente es muy simple y una excelente solución. ¡Lo he comparado con LZMA y está subiendo 10 veces más rápido y con una compresión comparable! –

2

Este ejemplo: http://cheeso.members.winisp.net/srcview.aspx?dir=js-unzip muestra cómo se puede hacer 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 utilizar ese código sin cambios si quieres 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.

+0

El primer enlace ya no está en línea. – heinob

+0

sí, lo siento, lo sé. Trabajaré en llevarlo a un lugar nuevo. – Cheeso

2

me encontré con una implementación funcional inflar aquí:

http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt

Si desea una versión ligeramente más limpio que espacios de nombres del algoritmo, éste debería funcionar:

https://github.com/augustl/js-inflate

que tener en cuenta que los datos de "inflar" en gzip tengan como prefijo un encabezado de dos bytes y un sufijo con una suma de comprobación de cuatro bytes, que deberá quitar antes de pasar al algoritmo.

Cuestiones relacionadas