Сжатие строк в JavaScript

javascript google-chrome-extension lossless-compression

34152 просмотра

6 ответа

Я ищу функцию JavaScript, которая дает строку возвращает сжатую (более короткую) строку.

Я занимаюсь разработкой веб-приложения для Chrome, которое сохраняет длинные строки (HTML) в локальной базе данных. В целях тестирования я попытался сжать файл, хранящий базу данных, и он сократился в пять раз, поэтому я решил, что это поможет сохранить базу данных меньше, если я сожму вещи, которые она хранит.

Я нашел реализацию LZSS в JavaScript здесь: http://code.google.com/p/u-lzss/ ("U-LZSS").

Похоже, он работал, когда я тестировал его «вручную» с короткими примерами строк (decode === encode), и это довольно быстро, в Chrome. Но когда дают большие строки (100 ko), кажется, что они искажают / перепутывают последнюю половину строки.

Возможно ли, что U-LZSS ожидает короткие строки и не может иметь дело с большими строками? И можно ли будет отрегулировать некоторые параметры, чтобы переместить этот верхний предел?

Автор: Bambax Источник Размещён: 13.11.2019 11:30

Ответы (6)


29 плюса

Я только что выпустил небольшую реализацию LZW, специально разработанную для этой цели, поскольку ни одна из существующих реализаций не отвечала моим потребностям.

Это то, что я использую в будущем, и я, возможно, постараюсь улучшить библиотеку в какой-то момент.

Автор: pieroxy Размещён: 09.05.2013 10:29

5 плюса

Решение

По предложению Писквора я проверил код, найденный в ответе на этот вопрос: JavaScript-реализация Gzip (голосование с наибольшим количеством голосов: LZW-реализация) и обнаружил, что:

  1. оно работает
  2. это уменьшает размер базы данных в два раза

... что меньше 5, но лучше, чем ничего! Так что я использовал это.

(Хотелось бы, чтобы я принял ответ от Писквора, но это был только комментарий).

Автор: Bambax Размещён: 03.01.2011 12:16

5 плюса

Мне кажется нецелесообразным сжимать строку, используя UTF-8 в качестве пункта назначения ... Похоже, просто искать проблемы. Я думаю, что было бы лучше потерять некоторое сжатие и использовать простой 7-битный ASCII в качестве места назначения.

В игрушечной демонстрации JavaScript на 4 КБ, которую я написал для забавы, я использовал кодировку для результата сжатия, которая хранит четыре двоичных байта в пяти символах, выбранных из подмножества ASCII из 85 символов, который является чистым для встраивания в строку JavaScript (85 ^ 5 немного больше, чем 8 ^ 4, но все еще соответствует точности целых чисел JavaScript). Это делает сжатые данные безопасными, например, для JSON без необходимости экранирования.

Автор: 6502 Размещён: 31.12.2010 01:36

4 плюса

Здесь представлены функции кодирования (276 байт, функция en) и декодирования (191 байт, функция de), которые я модифицировал из LZW в полностью рабочей демонстрации. В Интернете нет более мелкой или более быстрой рутины, чем то, что я вам здесь даю.

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

Автор: Dave Brown Размещён: 09.01.2016 10:55

1 плюс

Попробуйте поэкспериментировать с текстовыми файлами, прежде чем что-то реализовывать, потому что я думаю, что следующее не обязательно выполняется:

поэтому я решил, что это поможет сохранить базу данных меньше, если я сожму вещи, которые она хранит.

Это потому, что алгоритмы сжатия без потерь довольно хороши с повторяющимися шаблонами (например, пробелами).

Автор: cherouvim Размещён: 31.12.2010 01:22

1 плюс

Я думаю, вы также должны изучить lz-string, он быстро сжимает и имеет некоторые преимущества, которые они перечисляют на своей странице:

А как насчет других библиотек?

  • некоторые реализации LZW, которые возвращают вам массивы чисел (ужасно неэффективно хранить, так как токены занимают 64 бита) и не поддерживают символы выше 255.
  • некоторые другие реализации LZW, которые возвращают вам строку (менее ужасно неэффективно хранить, но все же все токены занимают 16 бит) и не поддерживают какой-либо символ выше 255.
  • реализация LZMA, которая является асинхронной и очень медленной - но эй, это LZMA, а не реализация, которая медленная.
  • реализация GZip на самом деле не предназначена для браузеров, но предназначена для node.js, который весил 70 КБ (с deflate.js и crc32.js, от которых он зависит).

Причины, по которым автор создал lz-string:

  • Работая на мобильном, мне нужно было что-то быстрое.
  • Работая со строками, собранными извне моего сайта, мне нужно было что-то, что может принимать любую строку в качестве входных данных, включая любые символы UTF выше 255.
  • Библиотека, не принимающая 70 КБ, была явным плюсом. То, что создает строки настолько компактные, насколько это возможно, для хранения в localStorage. Поэтому ни одна из библиотек, которые я мог найти в Интернете, не работала для моих нужд.

Существуют реализации этой библиотеки на других языках, в настоящее время я смотрю на реализацию на python, но декомпрессия в данный момент, похоже, имеет проблемы, но если вы придерживаетесь только JS, она выглядит действительно хорошо для меня.

Автор: Nils Ziehn Размещён: 29.01.2016 06:27
Вопросы из категории :
32x32