使用 ByteArrays 解压缩 Zlib 字符串

Sri*_*Sri 5 python apache-flex compression zlib actionscript-3

我有一个用 Adob​​e Flex 3 和 Python 2.5(部署在 Google App Engine 上)开发的 Web 应用程序。已用 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();
Run Code Online (Sandbox Code Playgroud)

它在 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()
Run Code Online (Sandbox Code Playgroud)

事件属于 ResultEvent 类型。

错误:

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

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

-- 斯里

Joh*_*hin 2

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

更新您需要什么文档来支持byteArray.uncompress()期望真正的zlib流而不是deflate流(即剪切前 2 个字节和最后 4 个字节后的 zlib 流)的概念?

ByteArray的 Flex 3 文档给出了这个例子:

bytes.uncompress(CompressionAlgorithm.DEFLATE);

但没有说明默认值(如果有的话)是什么。如果存在默认值,则不会在任何明显的地方进行记录,因此使用它是一个非常好的主意

bytes.uncompress(CompressionAlgorithm.ZLIB);

让你的意图变得显而易见。

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

更新2

感谢您提供网址。看来我掌握了“帮助”,而不是真正的文档:=(。有几点:

(1) 是的,有一个显式的inflate()方法。然而,uncompress 有一个算法 arg;它可以是 CompressionAlgorithm.ZLIB(默认)或 CompressionAlgorithm.DEFLATE ...有趣的是,后者仅在 Adob​​e Air 中可用,在 Flash Player 中不可用。至少我们知道 uncompress() 调用看起来没问题,并且我们可以回到将原始字节连接到网络上并再次连接到 ByteArray 实例的问题。

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

无论提供 UTF8 编码字节(nil,恕我直言)有什么优点,您都不需要 2 字节长度的前缀;使用 writeUTF() 肯定会导致 uncompress() 崩溃

将其连接到网络上:在二进制数据上使用 Python print 似乎不是一个好主意(除非 sys.stdout 已经被贵族以原始模式运行,而您没有在代码中显示)。

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

鉴于我直到今天才知道 Flex 的存在,我真的无法有效地帮助你。以下是一些关于自给自足的进一步建议,以防很快没有人知道更多的弹性:

(1)进行一些调试。从一个最小的 XML 文档开始。展示repr(xml_doc)。展示repr(zlib_compress_output)。在 Flex 脚本(的简化版本)中,使用最接近的函数/方法来repr()显示:event.resultevent.result.toString()的结果writeUTF*()。确保您了解 zlib.compress() 之后可能发生的所有事情的影响。仔细阅读文档可能会有所帮助。

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

HTH,约翰