python – 使用ByteArrays解压缩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.

– 斯里兰卡

最佳答案 什么是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()方法.然而,解压缩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已经被愚弄以原始模式运行,你没有在你的代码中显示).

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

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

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

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

HTH,
约翰

点赞