2011-02-02 6 views
29

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

Я нашел:

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

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

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

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

+3

Основная проблема заключается в том, что JavaScript не имеет средств для обработки необработанных данных. Все числа являются плавающей точкой, и все строковые значения сохраняются как UTF-16 (2-байтовые символы). Нет типа данных «байтового массива», что делает реализацию сжатия/декомпрессии намного сложнее и значительно менее эффективной. – Pointy

+4

Неверно, есть поддержка двоичных данных в последних реализациях JavaScript на основе [Typed Array Specification] (http://www.khronos.org/registry/typedarray/specs/latest/). –

+0

Да, это правда - это, безусловно, было бы полезно :-) – Pointy

ответ

9

Взгляните на this Stack Overflow question, ответы там содержат ссылки на несколько двигателей сжатия, реализованных в javascript. Большинство из них основаны на LZ77.

-4

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

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

+11

Я не спрашиваю, хорошо это или плохо. Я ищу реализации. -1. –

+4

Это очень хороший совет, @Ondra. Если вы хотите сделать что-то, что считается «плохой идеей» у многих людей с опытом, вы должны объяснить свои причины. – Pointy

+3

@Pointy: Я не согласен. Конечно, вы правы, но если кто-то просит что-то неортодоксальное, это, вероятно, не лучшая вещь, чтобы просто махать парящим пальцем, независимо от опыта. – jAndy

9

Я не знаю, как вы хотели бы, но мне нравятся эти реализации:

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

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

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

+3

Второй url (gzipjs) не имеет ни одного кода, отправленного в любом месте ... или я чего-то не хватает? –

+1

Это должны быть принятые ответные парни. – almosnow

+0

Я уже много часов искал, я пропустил этот ответ в первый раз, но это действительно очень просто и отличное решение. Я сравнивал его с LZMA, и он приближается в 10 раз быстрее и с сопоставимым сжатием! –

2

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

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

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 (aka unzip), то есть 2-байтная подпись, которую вы должны прочитать и проверить перед чтением сжатых байтов и выполнением INFLATE. Просто измените InflatingReader на чтение и сброс 2 байтов, и он будет делать ZLIB просто отлично.

+0

Первая ссылка больше не в сети. – heinob

+0

да, извините, я знаю. Я буду работать над тем, чтобы попасть на новое место. – Cheeso

2

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

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

Если вы хотите немного чище версию, что пространства имен алгоритма, это один должен работать:

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

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

3

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

Смежные вопросы