Написание алгоритма Flex 3 ByteArray - PullRequest
1 голос
/ 27 октября 2010

У меня возникла проблема с реализацией клиента Flex 3.0.0, который получает сжатое тело HTTP с сервера через библиотеку сокетов HTTP (не class HTTPService).

Сначала кажется, что nginx поддерживает ТОЛЬКО gzip сжатие с gzip on;. (Поправьте меня, если я ошибаюсь.) Итак, добавьте HTTP-заголовок Accept-Encoding: gzip для запроса.

Затем я получаю сжатый ByteArray из ответа HTTP с заголовком Content-Encoding: gzip.

Проблема здесь в том, чтобы правильно распаковать сжатые данные, а именно тело HTTP.

В более поздней версии Flex в ByteArray есть функция deflate. Но его нет в Flex 3.0.0. Обновление до более поздней версии не является вариантом, так как это сделает существующие приложения нестабильными с некоторыми новыми замеченными и невидимыми ошибками.

Есть ли альтернативный способ, код или библиотека, чтобы распаковать данные gzip в ByteArray?

Ответы [ 3 ]

1 голос
/ 27 октября 2010

Необходимые методы ByteArray не привязаны к конкретной версии Flex. (Класс ByteArray не является классом Flex - он является частью встроенных классов в Flash Player и AIR.) Поэтому даже если ваше приложение использует Flex 3, если вы можете использовать Flash Player 10+ или AIR 1+, должен иметь возможность использовать эту библиотеку.

Если это абсолютно невозможно, есть другая возможность, но это потребует некоторой работы.

Эта библиотека ActionScript создана для работы с файлами .zip: http://nochump.com/blog/archives/15

Однако он не использует встроенное сжатие ByteArray, а вместо этого включает в себя реализацию ActionScript алгоритма flate. Таким образом, вы можете (теоретически) использовать класс Inflater из этой библиотеки вместо вызова ByteArray.uncompress () в библиотеке GZip, упомянутой Чуббардом

1 голос
/ 28 октября 2010

Из ответа Чаббарда и Пробертсона. Я разработал решение.

http://probertson.com/projects/gzipencoder/

http://nochump.com/blog/archives/15

Добавление GzipEncoder и Zip Library в src

In GzipBytesEncoder.as из GzipEncoder (com.probertson.utils),

заменить

srcBytes.deflate();

с

var outBuffer:ByteArray = new ByteArray;
var deflater:Deflater = new Deflater();
deflater.setInput(srcBytes);
deflater.deflate(outBuffer)
srcBytes = outBuffer;

и заменить

data.inflate();

с

var outBuffer:ByteArray = new ByteArray;
var inflater:Inflater = new Inflater();
inflater.setInput(data);
inflater.inflate(outBuffer)
data = outBuffer;
0 голосов
/ 27 октября 2010
...