在Python中压缩并使用解压缩C#解压缩的最简单方法(反之亦然)

我有一个程序,它有一个基于Mono的C#客户端和一个Python服务器,它通过TCP / IP套接字进行通信。 消息使用的主要是二进制格式,但每条消息的最大部分通常是嵌入的UTF-8字符串(英文)。 每条消息通常都很短(小于100字节),但有些消息可能更长(最多64K)。 交换了大量数据,我希望通过在传输数据时压缩数据来减少消息大小和带宽使用。

我最初的研究没有发现任何明显与2个标准库兼容的东西。 Python有一个zlib库,但我不能使用C#的DeflateStream或GZipStream(因为它们需要一个我没有的外部DLL),它似乎不适用于SharpZipLib的ZipOutputStream(给出“错误-3 – 不正确标题“回复”。 (那些不使用Mono的人可能会有更多运气 – 请参阅Duncan的答案。)

我有兴趣听到关于通过此通信链路实现压缩的简单方法,请记住,任何可能易于使用一种语言实现的解决方案都需要在另一种语言中具有等效性。 我接受一个专门针对UTF-8字符串而不是二进制消息的解决方案,尽管优先选择是压缩整个字节流。

理想情况下,我希望将外部依赖性保持在最低限度,但我意识到这可能不实用。

更新: 尝试使用SharpZipLib并在Python解码方面遇到重复错误,我真的可以使用已知可用的代码的具体建议,而不仅仅是针对一种语言或另一种语言的压缩库的建议。

SharpZipLib的BZip2和Python的库为我工作。 这是我测试的内容以及如何:

首先,C#程序(引用SharpZipLib):

using System; using ICSharpCode.SharpZipLib.BZip2; using System.IO; namespace Test { class MainClass { public static void Main(string[] args) { var fStream = new FileStream("/home/konrad/output.bin", FileMode.Create); using(var writer = new StreamWriter(new BZip2OutputStream(fStream))) { for(var i = 0; i < 10; i++) { writer.WriteLine("Line no {0}.", i); } } } } } 

然后是Python:

 from bz2 import BZ2File import sys f = BZ2File("/home/konrad/output.bin") for line in f.readlines(): sys.stdout.write(line) 

接下来,运行C#程序。 在那之后:

 $ python ctest.py Line no 0. Line no 1. Line no 2. Line no 3. Line no 4. Line no 5. Line no 6. Line no 7. Line no 8. Line no 9. 

我认为它也是相反的。

你写了:

类似地,两个标准库都提供gzip压缩,但Python希望在这种情况下使用文件,这是不实际的。

事实并非如此。 Python的gzip.GZipFile()类采用filenamefileobj 。 如果要使用字符串,只需使用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() 

看来你在* nix系统上。 如果是这种情况并且所有其他方法都失败了,您可以简单地使用系统库(Mono.Unix.Native),而不必担心找到正确的.Net库。

我过去曾使用zlib for .net,还有一些库包装本机zlib库以提供托管解决方案。 我需要做一些与你正在做的事情类似的事情。 我会直接在内存中进行压缩以进行较小的传输,并将压缩到文件,然后从URL下载文件并从文件解压缩以获得更大的文件。