JavaScript: распаковать / надуть / распаковать / разархивировать строки

Я ищу JavaScript-реализацию алгоритмов надувания строк. Я хочу сжимать на стороне сервера (Java) и распаковывать на стороне клиента (JavaScript).

Я обнаружил:

распаковать строки в javascript
Эта строка помечена как ответ с ответом на другую проблему. Другие ответы также относятся к другому (разархивирование файлов в формате ZIP).

Реализация раздувания JavaScript (возможно, только FF 3.6)
Это ближе всего к тому, что мне нужно. Однако хотелось бы иметь альтернативу.

Предложения?
Спасибо, Ондра

Обновление. У меня довольно специфический вариант использования, пожалуйста, не отвечайте «Не делайте этого в JavaScript». Я пишу «автономный» инструмент отчетов (после создания он помещается в статическое хранилище), и при дефляции можно сэкономить мегабайты для одного отчета. Я ограничен другими приложениями, поэтому я не могу сохранить его в виде zip-файла.


person Ondra Žižka    schedule 02.02.2011    source источник
comment
Основная проблема будет в том, что в JavaScript нет средств для управления необработанными данными. Все числа являются числами с плавающей запятой, а все строковые значения сохраняются в формате UTF-16 (2-байтовые символы). Тип данных байтового массива отсутствует, поэтому реализация сжатия / распаковки намного сложнее и менее эффективна.   -  person Pointy    schedule 02.02.2011
comment
Неправда, в последних реализациях JavaScript есть поддержка двоичных данных, основанная на Спецификации типизированного массива < / а>.   -  person Ondra Žižka    schedule 17.07.2011
comment
да, это правда - это, безусловно, было бы полезно :-)   -  person Pointy    schedule 17.07.2011
comment
Браузер уже использует реализацию C / C ++ того, что вам нужно, найдите способ получить к нему доступ через .js. Я написал родную .js-версию JSON для развлечения, и она была примерно в 100 раз медленнее, чем реализация Broswer на C / C ++.   -  person CS_2013    schedule 09.06.2012


Ответы (7)


Взгляните на этот вопрос о переполнении стека, ответы там содержат ссылки на несколько механизмов сжатия, реализованных в javascript. Большинство из них основано на LZ77.

person Sean Kinsey    schedule 02.02.2011

Не знаю, как вам это нравится, но мне нравятся эти реализации:

Первый быстрее, чем второй. Обычно мы можем обеспечить быстрый сервер, однако нам неизвестна производительность клиентской машины. Поэтому я рекомендую вам выбрать js-deflate и настроить java (на стороне сервера) на раздувание.

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

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

person Gustavo Costa De Oliveira    schedule 02.02.2011
comment
Второй URL (gzipjs) нигде не содержит кода ... или мне что-то не хватает? - person Tute; 20.04.2012
comment
Это должен быть принятый ответ, чуваки. - person almosnow; 17.10.2012
comment
Я искал уже несколько часов, я пропустил этот ответ в первый раз, но это действительно очень простое и отличное решение. Я сравнивал его с LZMA, и он стал в 10 раз быстрее и с сопоставимым сжатием! - person Billy Moon; 05.02.2013
comment
Разве inflate не расширяет данные? - person Jus12; 07.07.2016

Я создал рабочий пример, используя pako, современный и быстрый Zlib порт. http://jsfiddle.net/9yH7M/2/

person Redsandro    schedule 26.03.2014

есть эта графическая библиотека, в состав которой входит реализация zlib на javascript. если вы немного прокрутите эту страницу вниз, вы увидите ее как отдельную загрузку. http://jsxgraph.uni-bayreuth.de/wp/download/

person Breton    schedule 26.09.2011

Этот пример: http://cheeso.members.winisp.net/srcview.aspx?dir=js-unzip показывает, как создавать ZIP-файлы в Javascript. Теперь я знаю, что вам нужно сжатие ZLIB или DEFLATE, а не ZIP. Но ZIP использует DEFLATE, и в файле .js для этого примера есть класс InflatingReader, который может НАДУВАТЬ при чтении.

Класс предоставляет следующие методы:

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

Вы можете использовать этот код без изменений, если хотите INFLATE.

Если вам нужен ZLIB (также известный как разархивированный), тогда имеется двухбайтовая подпись, которую вы необходимо прочитать и проверить перед чтением сжатых байтов и выполнением INFLATE. Просто измените InflatingReader на чтение и сброс 2 байтов, и он отлично справится с ZLIB.

person Cheeso    schedule 03.02.2011
comment
Первой ссылки больше нет в сети. - person heinob; 06.06.2013
comment
да, извините, я знаю. Я постараюсь перенести его на новое место. - person Cheeso; 10.06.2013

Я нашел здесь работающую реализацию надувания:

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

Если вам нужна более чистая версия с пространством имен алгоритма, эта должна работать:

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

Имейте в виду, что сжатые gzip-данные «inflate» имеют префикс с двухбайтовым заголовком и суффикс с четырехбайтовой контрольной суммой, которую вам нужно будет удалить перед передачей алгоритму.

person Alexander Staubo    schedule 24.02.2011

Не делайте этого в JavaScript. Это будет медленно, к тому же JS плохо справляется с двоичными данными.

Просто используйте кодировку передачи gzip на стороне сервера, и ваш браузер позаботится о ее распаковке.

person ThiefMaster    schedule 02.02.2011
comment
Я не спрашиваю, хорошо это или плохо. Ищу реализации. -1. - person Ondra Žižka; 02.02.2011
comment
Это очень хороший совет, @Ondra. Если вы хотите сделать что-то, что многие специалисты считают плохой идеей, вы должны объяснить свои причины. - person Pointy; 02.02.2011
comment
@Pointy: Я не согласен. Конечно, вы правы, но если кто-то просит чего-то неортодоксального, вероятно, не лучше просто помахать пальцем, независимо от опыта. - person jAndy; 02.02.2011
comment
@jAndy проблема в том, что часто невозможно отличить просто от вопроса, является ли задающий вопрос полным новичком или опытным программистом. Неопытные кодировщики могут получить значительную пользу от такого рода советов; на самом деле, на мой взгляд, такой ответ - самая полезная вещь в Stackoverflow. Исходный вопрос почти не содержит второстепенного объяснения целей, поэтому, основываясь на чистой статистике, предположение о том, что требуется некоторый базовый совет, является хорошим предположением. - person Pointy; 02.02.2011
comment
@Pointy, ты прав, но тогда надо идти НЕ к ответам, а к комментариям. - person Ondra Žižka; 02.02.2011
comment
Что ж, @Ondra, это определенно хороший аргумент. - person Pointy; 02.02.2011
comment
К вашему сведению, в последних реализациях JavaScript есть поддержка двоичных данных, основанная на Спецификации типизированного массива . - person Ondra Žižka; 23.05.2011
comment
Однако не все современные браузеры поддерживают его. - person ThiefMaster; 23.05.2011
comment
Я думаю, что этот ответ и его комментарии немного отстают от времени, когда речь идет о javascript. Я говорю это с величайшим уважением, вернемся в 2003 год. --- JS - это не просто язык браузера, и это не игрушечный язык, он может обрабатывать двоичные данные и быстрее, чем python и ruby. - person Breton; 26.09.2011
comment
Он явно сказал, что распаковать на стороне клиента, поэтому в его случае он использует его в браузере, где поддержка двоичных данных не всегда доступна. Кроме того, браузеры изначально поддерживают распаковку gzip (реализация C / C ++), поэтому очень высоки шансы, что будет более эффективно использовать кодирование передачи вместо обработки распаковки вручную. - person ThiefMaster; 26.09.2011
comment
1. Вернитесь в 2003 год. 2. Это не очень помогает. - person Breton; 26.09.2011
comment
Опять же, зачем вам заново реализовывать то, что уже поддерживается изначально? - person ThiefMaster; 26.09.2011
comment
Если он использует Java на стороне сервера, велики шансы, что он имеет полный контроль над сервером - и если он просто хочет уменьшить размер передаваемых данных, ему не нужен доступ как к сжатым, так и к несжатым данным в JS. .. - person ThiefMaster; 27.09.2011
comment
Ява? Это довольно случайное предположение. Интересно, где ты это взял. Просто хочет уменьшить размер передаваемых данных. где ты это взял? Я признаю, что в исходном вопросе не так много информации, но решение состоит в том, чтобы задавать вопросы, а не делать предположения. - person Breton; 27.09.2011
comment
на стороне сервера (Java) - так что это не просто предположение. - person ThiefMaster; 27.09.2011
comment
Ах, прости. Я пропустил это. - person Breton; 29.09.2011
comment
@Breton, да, у меня есть вариант использования, который использует LocalStorage для создания кроссбраузерного веб-приложения с автономной поддержкой (прокрутите IndexedDB на Webkit), поэтому я хочу кодировать данные JSON и сжимать их, чтобы максимально использовать 5 МБ Мне разрешено, не заставляя пользователя возиться со своими настройками ... - person james-geldart; 29.05.2012