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

时间:2012-05-04 11:33:34

标签: c# .net python mono compression

我有一个带有基于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解码方面遇到重复错误时,我确实可以使用已知可用的代码的具体建议,而不仅仅是针对一种语言或其他语言的压缩库建议。

4 个答案:

答案 0 :(得分:3)

您写道:

  

同样,两个标准库都提供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()

答案 1 :(得分:2)

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.

我认为它也是相反的。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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