gpt4 book ai didi

python - 使用 ByteArrays 解压缩 Zlib 字符串

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:12 25 4
gpt4 key购买 nike

我有一个使用 Adob​​e 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 流而不是 < strong>deflate 流(即,在你剪掉前 2 个字节和最后 4 个字节之后的 zlib 流)?

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

bytes.uncompress(CompressionAlgorithm.DEFLATE);

但毫无帮助的是没有说明默认值(如果有的话)是什么。如果有默认值,则不会在任何明显的地方记录,因此您最好使用

bytes.uncompress(CompressionAlgorithm.ZLIB);

使您的意图显而易见。

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

更新 2

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

(1) 是的,有一个明确的inflate() 方法。但是解压缩确实有一个算法参数;它可以是 CompressionAlgorithm.ZLIB(默认值)或 CompressionAlgorithm.DEFLATE ... 有趣的是,后者仅在 Adob​​e Air 中可用,在 Flash Player 中不可用。至少我们知道 uncompress() 调用看起来正常,我们可以回到将原始字节传输到网络并再次传输到 ByteArray 实例的问题。

(2) 更重要的是,既有writeUTF(Write a UTF-8 string to the byte stream。UTF-8字符串的字节长度为首先写入,作为 16 位整数,然后是表示字符串字符的字节)和 writeUTFBytes(将 UTF-8 字符串写入字节流。类似到 writeUTF() 方法,但 writeUTFBytes() 不会在字符串前加上 16 位长度的字)。

无论提供 UTF8 编码字节(无,恕我直言)的优点是什么,您都不希望那里有 2 字节长度的前缀; 使用 writeUTF() 肯定会导致 uncompress() 失败

开始使用:在二进制数据上使用 Python 打印似乎不是一个好主意(除非 sys.stdout 已被指定为以原始模式运行,而您没有在代码中显示)。

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

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

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

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

喂,约翰

关于python - 使用 ByteArrays 解压缩 Zlib 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1830665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com