我有一个带有基于 Mono 的 C# 客户端和 Python 服务器的程序,它们通过 TCP/IP 套接字进行通信。这些消息主要使用二进制格式,但每条消息的最大部分通常是嵌入的 UTF-8 字符串(英文)。每条消息通常都很短(小于 100 字节),但有些消息可能更长(最多 64K)。交换大量数据,我想通过在传输数据时压缩数据来减少消息大小和带宽使用。
我最初的研究并没有发现任何在这两个标准库之间明显兼容的东西。 Python 有一个zlib http://docs.python.org/library/zlib.html库,但我不能使用 C# 的放气流 http://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream.aspx或 GZipStream (因为它们需要一个我没有的外部 DLL),并且它似乎无法与 SharpZipLib 的 ZipOutputStream 一起使用(给出“错误 -3 - 错误的标头”响应)。 (那些不使用 Mono 的人可能会更幸运 - 请参阅下面邓肯的回答。)
我有兴趣了解在该通信链路上启用压缩的简单方法,请记住,任何可以轻松用一种语言实现的解决方案都需要在另一种语言中具有等效的解决方案。我接受专门针对 UTF-8 字符串而不是二进制消息的解决方案,尽管首选是压缩整个字节流。
理想情况下,我希望将外部依赖性保持在最低限度,但我意识到这可能不切实际。
UPDATE: 在尝试使用 SharpZipLib 并在 Python 解码方面遇到重复错误后,我确实可以使用已知有效的代码提出具体建议,而不仅仅是针对一种语言或另一种语言的压缩库的建议。
你写了:
同样,两个标准库都提供 gzip 压缩,但 Python
期望在这种情况下使用文件,这是不切实际的。
这实际上不是真的。蟒蛇的gzip.GZipFile()
类需要一个filename
or a fileobj
。如果你想使用字符串,只需使用StringIO
对象作为fileobj
:
from gzip import GzipFile
from StringIO import StringIO
sio = StringIO()
with GzipFile(fileobj=sio, mode='wb') as gzip:
gzip.write('uncompressed data')
compressed = sio.getvalue()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)