Domanda

Sto cercando una funzione JavaScript che data una stringa restituisce un (breve) stringa compressa.

Sto sviluppando un'applicazione web Chrome che consente di risparmiare lunghe stringhe (HTML) per un database locale. A scopo di verifica ho cercato di comprimere il file è salvato il database, e si è ridotto di un fattore di cinque, così ho pensato che sarebbe aiutare a mantenere il database più piccolo se compresso le cose che negozi.

Ho trovato un'implementazione di LZSS in JavaScript qui: http://code.google com / p / u-LZSS / ( "U-LZSS").

Sembrava di lavoro quando ho provato "a mano" con brevi stringhe di esempio (decodifica === codificare), ed è ragionevolmente veloce anche in Chrome. Ma quando dato grandi stringhe (100 ko) sembra garble / mischiare l'ultima metà della stringa.

E 'possibile che U-LZSS aspetta stringhe brevi e non può trattare con le stringhe più grandi? E sarebbe possibile regolare alcuni parametri al fine di spostare quel limite superiore?

È stato utile?

Soluzione 2

Al suggerimento di Piskvor, ho provato il codice trovato in una risposta a questa domanda: JavaScript attuazione Gzip (Risposta top-votato: implementazione LZW) e ha rilevato che:

  1. funziona
  2. riduce la dimensione del database di un fattore due

... che è meno di 5, ma meglio di niente! Così ho usato questo.

(Vorrei poter accettato una risposta da Piskvor ma fu solo un commento).

Altri suggerimenti

Ho appena rilasciato un piccolo LZW implementazione in particolare su misura per questo scopo, come nessuna delle implementazioni esistenti ha fatto soddisfare le mie esigenze.

Questo è quello che sto usando andando avanti, e io probabilmente cercare di migliorare la biblioteca ad un certo punto.

A me non sembra ragionevole per comprimere una stringa utilizzando UTF-8 come destinazione ... Sembra che solo in cerca di guai. Penso che sarebbe meglio perdere un po 'di compressione e l'utilizzo semplice 7-bit ASCII come destinazione.

In un giocattolo 4 KB demo JavaScript che ho scritto per il divertimento che ho usato una codifica per il risultato di compressione che memorizza quattro byte binari in cinque caratteri scelti da un sottoinsieme di ASCII di 85 caratteri che è pulito per l'incorporamento in una stringa JavaScript (85 ^ 5 è leggermente più di 8 ^ 4, ma ancora si inserisce nella precisione di numeri interi JavaScript) . Questo rende compressa sicura dei dati, ad esempio per JSON senza bisogno di alcuna fuga.

Ecco encode (276 byte, la funzione IT) e decodificare (191 byte, la funzione de) funzioni I modded da LZW in una demo completamente funzionante. Non c'è più piccolo o più veloce di routine disponibili su Internet di quello che sto dando qui.

function en(c){var x='charCodeAt',b,e={},f=c.split(""),d=[],a=f[0],g=256;for(b=1;b<f.length;b++)c=f[b],null!=e[a+c]?a+=c:(d.push(1<a.length?e[a]:a[x](0)),e[a+c]=g,g++,a=c);d.push(1<a.length?e[a]:a[x](0));for(b=0;b<d.length;b++)d[b]=String.fromCharCode(d[b]);return d.join("")}

function de(b){var a,e={},d=b.split(""),c=f=d[0],g=[c],h=o=256;for(b=1;b<d.length;b++)a=d[b].charCodeAt(0),a=h>a?d[b]:e[a]?e[a]:f+c,g.push(a),c=a.charAt(0),e[o]=f+c,o++,f=a;return g.join("")}

var compressed=en("http://www.ScriptCompress.com - Simple Packer/Minify/Compress JavaScript Minify, Fixify & Prettify 75 JS Obfuscators In 1 App 25 JS Compressors (Gzip, Bzip, LZMA, etc) PHP, HTML & JS Packers In 1 App PHP Source Code Packers Text Packer HTML Packer or v2 or v3 or LZW Twitter Compress or More Words DNA & Base64 Packer (freq tool) or v2 JS JavaScript Code Golfer Encode Between Quotes Decode Almost Anything Password Protect Scripts HTML Minifier v2 or Encoder or Escaper CSS Minifier or Compressor v2 SVG Image Shrinker HTML To: SVG or SVGZ (Gzipped) HTML To: PNG or v2 2015 JS Packer v2 v3 Embedded File Generator Extreme Packer or version 2 Our Blog DemoScene JS Packer Basic JS Packer or New Version Asciify JavaScript Escape JavaScript Characters UnPacker Packed JS JavaScript Minify/Uglify Text Splitter/Chunker Twitter, Use More Characters Base64 Drag 'n Drop Redirect URL DataURI Get Words Repeated LZMA Archiver ZIP Read/Extract/Make BEAUTIFIER & CODE FIXER WHAK-A-SCRIPT JAVASCRIPT MANGLER 30 STRING ENCODERS CONVERTERS, ENCRYPTION & ENCODERS 43 Byte 1px GIF Generator Steganography PNG Generator WEB APPS VIA DATAURL OLD VERSION OF WHAK PAKr Fun Text Encrypt Our Google");
var decompressed=de(compressed);

document.writeln('<hr>'+compressed+'<hr><h1>'+compressed.length+' characters versus original '+decompressed.length+' characters.</h1><hr>'+decompressed+'<hr>');

Prova a sperimentare con file di testo prima di attuare qualsiasi cosa perché penso che quanto segue non è necessariamente vero:

così ho pensato che sarebbe aiutare a mantenere il database più piccolo se compresso le cose che negozi.

Questo perché algoritmi di compressione senza perdita di dati sono abbastanza buone con pattern ripetuti (per esempio gli spazi bianchi).

Credo che si dovrebbe anche prendere in considerazione lz-string è veloce un impacchi abbastanza bene e ha alcuni vantaggi che elencano sulla loro pagina:

Che dire di altre biblioteche?

  • alcune implementazioni LZW che da diritto all'utilizzo backup array di numeri (terribilmente inefficienti da memorizzare come gettoni prendono 64bit) e non supportano qualsiasi carattere sopra 255.
  • alcune altre implementazioni LZW che da diritto all'utilizzo eseguire una stringa (meno terribilmente inefficiente per memorizzare, ma ancora, tutti i gettoni prendere 16 bit) e non supportano alcun carattere sopra 255.
  • un'implementazione LZMA che è asincrono e molto lento - ma ehi, è LZMA, non l'implementazione che è lento
  • .
  • un'implementazione GZip non significava in realtà per i browser, ma pensato per node.js, che 70kb ponderata (con deflate.js e crc32.js da cui dipende).

I motivi per cui l'autore creato lz-stringa:

  • di lavoro sul cellulare avevo bisogno di qualcosa di veloce.
  • Operazioni con le stringhe raccolte da fuori del mio sito, ho bisogno di qualcosa che può prendere qualsiasi tipo di stringa come un input, compresi gli eventuali caratteri UTF sopra 255.
  • La biblioteca non prendere 70kb era un vantaggio definitivo. Qualcosa che produce corde più compatto possibile per conservare in localStorage. Quindi, nessuna delle librerie che ho trovato on-line ha funzionato bene per le mie esigenze.

Ci sono implementazioni di questo lib in altre lingue, attualmente sto esaminando l'attuazione pitone, ma la decompressione sembra avere problemi in questo momento, ma se si tiene fede a JS solo sembra davvero buono per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top