我有一个带有基于 Mono 的 C# 客户端和 Python 服务器的程序,它们通过 TCP/IP 套接字进行通信。这些消息主要使用二进制格式,但每条消息的最大部分通常是嵌入的 UTF-8 字符串(英文)。每条消息通常都很短(小于 100 字节),但有些可能更长(最多 64K)。交换大量数据,我希望通过在传输数据时压缩数据来减少消息大小和带宽使用。
我的初步研究并未发现任何在这两个标准库之间明显兼容的内容。 Python有一个zlib库,但我不能使用 C# 的 DeflateStream或 GZipStream (因为它们需要一个我没有的外部 DLL),并且它似乎无法与 SharpZipLib 的 ZipOutputStream 一起使用(给出“错误 -3 - 错误的 header ”响应)。 (那些不使用 Mono 的人可能会更幸运 - 请参阅下面邓肯的回答。)
我有兴趣了解在此通信链路上启用压缩的简单方法,请记住,任何可以轻松用一种语言实现的解决方案都需要在另一种语言中具有等效的解决方案。我接受专门针对 UTF-8 字符串而不是二进制消息的解决方案,尽管首选是压缩整个字节流。
理想情况下,我希望将外部依赖性保持在最低限度,但我意识到这可能不切实际。
更新:在尝试使用 SharpZipLib 并在 Python 解码方面遇到重复错误后,我确实可以使用已知有效的代码提出具体建议,而不仅仅是针对一种语言或另一种语言的压缩库的建议。
最佳答案
你写道:
Similarly both standard libraries offer gzip compression but Python expects to use file in this case, which is not practical.
这实际上不是真的。 Python 的 gzip.GZipFile()
类采用 filename
或 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()
关于c# - 在 Python 中压缩并使用解压缩 C# 解压缩的最简单方法(反之亦然),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10448023/