编写Flex 3 ByteArray deflate算法

时间:2010-10-27 02:52:42

标签: flex flex3 nginx gzip bytearray

我在实现Flex 3.0.0客户端时遇到了麻烦,该客户端通过套接字HTTP库(不是class HTTPService)从服务器接收压缩的HTTP正文。

首先,似乎nginx仅使用gzip支持gzip on;压缩。 (如果我错了,请纠正我。)因此,请将Accept-Encoding: gzip的HTTP标头添加到请求中。

然后我从带有标题ByteArray的HTTP响应中获得压缩的Content-Encoding: gzip

这里的问题是正确地解压缩压缩数据,即HTTP主体。

在Flex的更高版本中,ByteArray中有一个函数deflate。但它在Flex 3.0.0中不存在。升级到更高版本不是一个选项,因为它会使现有的应用程序不稳定,带来一些新的看不见的错误。

是否有替代方法,代码或库来解压缩gzip中的ByteArray数据?

3 个答案:

答案 0 :(得分:1)

所需的ByteArray方法与特定版本的Flex无关。 (ByteArray类不是Flex类 - 它是Flash Player和AIR中内置类的一部分。)因此,即使您的应用程序使用Flex 3,如果您可以定位Flash Player 10+或AIR 1+,那么您应该能够使用该库。

如果这绝对不可能,那么还有另一种可能性,但这需要一些工作。

创建此ActionScript库是为了使用.zip文件: http://nochump.com/blog/archives/15

但是,它不使用内置的ByteArray压缩,而是包含flate算法的ActionScript实现。所以你可以(理论上)使用该库中的Inflater类来代替Chubbard提到的GZip库中对ByteArray.uncompress()的调用

答案 1 :(得分:1)

来自chubbard和probertson的回答。我已经找到了解决方案。

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

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

将GzipEncoder和Zip Library添加到src

GzipBytesEncoder.as GzipEncodercom.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;

{{1}}

答案 2 :(得分:0)