开发者

Writing Flex 3 ByteArray deflate algorithm

I come into a trouble implementing a Flex 3.0.0 client that receives compressed HTTP body from server via a socket HTTP library (not class HTTPService ).

First it seems that nginx supports ONLY gzip compression with gzip on开发者_C百科;. (Correct me if I'm wrong.) So, add HTTP header of Accept-Encoding: gzip to request.

Then I get a compressed ByteArray from HTTP response with header Content-Encoding: gzip.

The problem here is to decompress the compressed data, namely the HTTP body, correctly.

In later version of Flex, there is a function deflate in ByteArray. But it is absent in Flex 3.0.0. Upgrading to higher version is not an option as it would make existing applications unstable with some new seen and unseen bugs.

Is there an alternative way, code or library, to decompress the gzip data in ByteArray?


The ByteArray methods that are needed aren't tied to a particular version of Flex. (The ByteArray class isn't a Flex class -- it's part of the built-in classes in Flash Player and AIR.) So even if your app uses Flex 3, if you can target Flash Player 10+ or AIR 1+ then you should be able to use that library.

If that's absolutely not possible, there is another possibility but it will take some work.

This ActionScript library is created for working with .zip files: http://nochump.com/blog/archives/15

However, it doesn't use the built-in ByteArray compression but instead includes an ActionScript implementation of the flate algorithm. So you could (theoretically) use the Inflater class from that library in place of the call to ByteArray.uncompress() in the GZip library mentioned by Chubbard


From chubbard and probertson's answer. I have worked out the solution.

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

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

Add GzipEncoder and Zip Library to src

In GzipBytesEncoder.as of GzipEncoder (com.probertson.utils),

replace

srcBytes.deflate();

with

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

And replace

data.inflate();

with

var outBuffer:ByteArray = new ByteArray;
var inflater:Inflater = new Inflater();
inflater.setInput(data);
inflater.inflate(outBuffer)
data = outBuffer;


Give this a try:

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜