Python 使用ByteArray解压中的Zlib字符串
我有一个用AdobeFlex3和Python2.5开发的web应用程序(部署在GoogleAppEngine上)。已经用Python创建了一个RESTful web服务,其结果目前是XML格式的,Flex正在使用HttpService对象读取该格式 现在的主要目标是压缩XML,以便HttpService send()方法和结果事件之间的时间尽可能短。我查阅了Python文档,并设法使用zlib.compress()压缩XML结果 然后,我将HttpService结果类型从“xml”设置为“text”,并尝试使用ByteArray将字符串解压缩回xml。这就是我失败的地方。我正在做这样的事情:Python 使用ByteArray解压中的Zlib字符串,python,apache-flex,actionscript-3,compression,zlib,Python,Apache Flex,Actionscript 3,Compression,Zlib,我有一个用AdobeFlex3和Python2.5开发的web应用程序(部署在GoogleAppEngine上)。已经用Python创建了一个RESTful web服务,其结果目前是XML格式的,Flex正在使用HttpService对象读取该格式 现在的主要目标是压缩XML,以便HttpService send()方法和结果事件之间的时间尽可能短。我查阅了Python文档,并设法使用zlib.compress()压缩XML结果 然后,我将HttpService结果类型从“xml”设置为“tex
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
错误:
# 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()
错误:错误#2058:解压缩数据时出错
该错误可能是因为byteArray.bytesAvailable的值=0,这意味着python生成的原始字节没有正确写入byteArray
--Sri什么是
byteArray.writeUTF(event.result.toString())代码>应该怎么做?compress()的结果既不是unicode也不是“UTF”(后面没有数字就没有意义!?);它是二进制的,也就是原始字节;您不应该对其进行解码或编码,也不应该对其应用任何其他转换。接收器应该立即解压缩它接收到的原始字节,以便恢复传递给zlib.compress()的数据
更新您需要哪些文档来支持byteArray.uncompress()
所期望的是一个真正的zlib流,而不是deflate流(即,在剪切前2个字节和最后4个字节后的zlib流)
的Flex 3文档给出了以下示例:
bytes.解压缩(CompressionAlgorithm.DEFLATE)代码>
但毫无帮助的是,他没有说明违约(如果有的话)是什么。如果有一个默认值,那么它在任何明显的地方都没有文档记录,所以使用它将是一个非常好的主意
bytes.解压缩(CompressionAlgorithm.ZLIB)代码>
让它明白你的意图
这些文档讨论的是writeUTFBytes
方法,而不是writeUTF
方法。您确定您在问题中复制/粘贴了准确的接收器代码吗
更新2
谢谢你的网址。看起来我得到了“帮助”,而不是真正的文档:=(.几点:
(1) 是的,有一个显式的inflate()
方法。但是解压确实有一个算法arg;它可以是CompressionAlgorithm.ZLIB(默认值)或CompressionAlgorithm.DEFLATE…有趣的是,后者仅在Adobe Air中可用,在Flash Player中不可用。至少我们知道解压()调用看起来正常,我们可以回到将原始字节放到线路上,然后再放到ByteArray实例中的问题
(2) 更重要的是,有writeUTF
(将UTF-8字符串写入字节流。UTF-8字符串的长度(以字节为单位)首先写入,作为16位整数,然后是表示字符串字符的字节)和writeUTFBytes
(将UTF-8字符串写入字节流。与writeUTF()方法类似,但writeUTFBytes()不在字符串前面加16位长的字)
无论提供UTF8编码字节(nil,IMHO)有什么好处,您都不希望在这里使用2字节长度的前缀;使用writeUTF()保证会导致uncompress()出错
开始:在二进制数据上使用Python打印似乎不是一个好主意(除非sys.stdout被命名为以原始模式运行,而您的代码中没有显示这种模式)
同样,使用event.result.toString()获取字符串(类似于Python unicode对象,是/否?)——使用什么然后用UTF-8编码似乎不太可能奏效
鉴于我直到今天才知道flex的存在,我真的无法有效地帮助您。以下是一些关于自给自足的进一步建议,以防知道更多flex的人不久就会出现:
(1) 进行一些调试。从一个最小的XML文档开始。Showrepr(XML\u doc)
。Showrepr(zlib\u compress\u output)
。在flex脚本的(精简版本)中,使用最接近repr()
的函数/方法来显示:event.result
,event.result.toString()
以及writeUTF*()
的结果。确保您了解zlib.compress()之后可能发生的一切影响。仔细阅读文档可能会有所帮助
(2) 看看如何从event.result中获取原始字节
嗯,,
John请编辑您的问题,以显示准确的错误消息。在python方面:如何将压缩数据放到线路上?@codeape,zlib.compress()返回一个字符串,该字符串为Flex HttpService对象读取的“打印”。是否正确?zlib.compress(xml)将原始字节作为字符串提供给我?然后我的问题是如何“馈送”将这些原始字节转换为字节数组,然后使用解压缩方法读取XML字符串。或者您是说我需要使用base64.encode()将原始字节编码为字符串?如果这个问题看起来很愚蠢,请原谅::P“既不解码也不编码”==我说您“需要使用base64.encode()”???很简单,接收者必须撤销发送者所做的任何事情。我们不确定发送者做了什么,因为您没有显示发送代码。请编辑您的问题,以包括(a)准确的错误消息(b)发送者代码。什么类型