使用ByteArrays解压缩Zlib字符串

时间:2009-12-02 04:32:43

标签: python flex actionscript-3 compression zlib

我有一个用Adobe Flex 3和Python 2.5开发的Web应用程序(部署在Google App Engine上)。已经在Python中创建了一个RESTful Web服务,其结果目前采用XML格式,Flex正在使用HttpService对象读取。

现在主要目标是压缩XML,以便HttpService send()方法和结果事件之间的时间更短。我查找了Python文档并设法使用zlib.compress()来压缩XML结果。

然后我将HttpService结果类型从“xml”设置为“text”,并尝试使用ByteArrays将字符串解压缩回XML。这是我失败的地方。我正在做这样的事情:

var byteArray:ByteArray = new ByteArray();
byteArray.writeUTF( event.result.toString() );
byteArray.uncompress();
var xmlResult:XML = byteArray.readUTF();

它在byteArray.uncompress()中抛出一个异常,并说无法解压缩byteArray。此外,当我跟踪byteArray的长度时,它得到0。

无法弄清楚我做错了什么。感谢所有帮助。

- 编辑 -

代码:

# compressing the xml result in Python
print zlib.compress(xmlResult)

# decompresisng it in AS3
var byteArray:ByteArray = new ByteArray();
byteArray.writeUTF( event.result.toString() );
byteArray.uncompress()

事件的类型为ResultEvent。

错误:

错误:错误#2058:解压缩数据时出错。

错误可能是因为byteArray.bytesAvailable = 0的值,这意味着生成的原始字节python尚未正确写入byteArray ..

- 斯里兰卡

1 个答案:

答案 0 :(得分:2)

byteArray.writeUTF( event.result.toString() );应该做什么? zlib.compress()的结果既不是unicode也不是“UTF”(没有数字之后没有意义!!);它是二进制又名原始字节;你既不应解码也不应编码,也不应对其应用任何其他转换。接收方应立即解压缩它收到的原始字节,以便恢复传递给zlib.compress()的数据。

更新您有哪些文档可以支持byteArray.uncompress()期望真正的 zlib 流而不是 deflate 的概念stream(即在剪切前2个字节和后4个字节后的zlib流)?

ByteArray的Flex 3文档提供了此示例:

bytes.uncompress(CompressionAlgorithm.DEFLATE);

但没有用,没有说明默认值(如果有的话)。如果有默认值,则没有任何明显的记录,因此您最好使用

bytes.uncompress(CompressionAlgorithm.ZLIB);

明确你想要的东西。

并且文档讨论了writeUTFBytes方法,而不是writeUTF方法。您确定在问题中复制/粘贴了确切的接收者代码吗?

更新2

感谢您的网址。看起来我抓住了“帮助”,而不是真正的文档:=(。几点:

(1)是的,有一个明确的inflate()方法。然而,解压缩DOES有一个算法arg;它可以是CompressionAlgorithm.ZLIB(默认值)或CompressionAlgorithm.DEFLATE ...有趣的是后者只能在Adobe Air中使用,而不能在Flash Player中使用。至少我们知道uncompress()调用看起来没问题,我们可以回到将原始字节放到线上并再次关闭到ByteArray实例的问题。

(2)更重要的是,有两个 writeUTF (将UTF-8字符串写入字节流。首先写入UTF-8字符串的长度,以字节为单位,作为一个16位整数,后跟表示字符串字符的字节)和 writeUTFBytes (将UTF-8字符串写入字节流。类似于writeUTF()方法,但writeUTFBytes()不会在字符串前加一个16位长的字。)

无论提供UTF8编码字节(nil,恕我直言)的优点是什么,你都不希望在那里有2字节长度的前缀;使用writeUTF()的保证会导致uncompress()到bork

开始使用它:在二进制数据上使用Python打印似乎不是一个好主意(除非sys.stdout已经被愚弄以原始模式运行,你没有在代码中显示)。 / p>

同样做event.result.toString()获取一个字符串(类似于Python unicode对象,是/否?) - 用什么然后用UTF-8编码它似乎不太可能工作。

鉴于我不知道灵活存在直到今天,我实在无法帮助你。以下是一些关于自给自足的进一步建议:如果没有人知道更多关于flex的事情,很快就会出现:

(1)做一些调试。从最小的XML文档开始。显示repr(xml_doc)。显示repr(zlib_compress_output)。在您的flex脚本的(缩减版本)中,使用可以找到的最近的repr()函数/方法来显示:event.resultevent.result.toString()以及{{1}的结果}}。确保您了解zlib.compress()之后可能发生的所有事情的影响。仔细阅读文档可能有所帮助。

(2)看看如何从event.result中获取原始字节。

HTH, 约翰