2010-10-27 28 views
1

我遇到了一個麻煩,它實現了一個Flex 3.0.0客戶端,它通過套接字HTTP庫(不是class HTTPService)從服務器接收壓縮的HTTP主體。Writing Flex 3 ByteArray deflate算法

首先,nginx似乎只支持gzip壓縮與gzip on;。 (如果我錯了,請糾正我。)因此,請添加HTTP標頭Accept-Encoding: gzip

然後我從HTTP響應中得到一個壓縮的ByteArray,標題爲Content-Encoding: gzip

這裏的問題是正確解壓壓縮的數據,即HTTP正文。

在Flex的更高版本中,ByteArray中有一個函數deflate。但它在Flex 3.0.0中不存在。升級到更高版本不是一種選擇,因爲它會使現有應用程序變得不穩定,出現一些新的看不見的錯誤。

是否有替代方法,代碼或庫,以解壓數據ByteArray

回答

1

所需要不依賴於Flex的特定版本的ByteArray方法。 (ByteArray類不是Flex類 - 它是Flash Player和AIR中的內置類的一部分。)因此,即使您的應用程序使用Flex 3,如果您可以定位Flash Player 10+或AIR 1+,那麼您應該能夠使用該庫。

如果這是絕對不可能的,還有另一種可能性,但需要一些工作。

此ActionScript庫與.zip文件創建工作: ​​

但是,它不使用內置的ByteArray壓縮,而是包括一個ActionScript實現flate算法。因此,您可以(理論上)使用該庫中的Inflater類代替Chubbard提到的GZip庫中的ByteArray.uncompress()調用

+0

它不編譯。這可能是SWC?與Flex 3.0.0一起在ByteArray中沒有這樣的函數。那是global.swc嗎?我不確定。 – OmniBus 2010-10-28 03:14:39

+0

圖書館運作良好。我修改了GzipEncoder而不是ByteArray。非常感謝。 – OmniBus 2010-10-28 03:16:37

1

來自chubbard和probertson的回答。我已經制定出解決方案。

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

​​

添加GzipEncoder和郵編圖書館SRC

GzipEncodercom.probertson.utilsGzipBytesEncoder.as

更換

srcBytes.deflate(); 

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

而且隨着

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