在Python最简单的方式来压缩和解压缩与C#(反之亦然)解压缩(Easiest way to co

2019-07-29 06:34发布

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

我最初的研究并没有止跌回升什么是跨越2个标准库兼容明显。 Python有一个的zlib库,但我不能使用C#的DeflateStream和GZipStream(因为他们需要我没有可用的外部DLL),它似乎并没有与SharpZipLib的ZipOutputStream(发放“错误-3工作-不正确标题”响应)。 (那些不使用单可能有更多的运气 - 见下文邓肯的回答。)

我有兴趣听一些简单方法,以便能够在该通信链路压缩,记住,这可能很容易在一个语言来实现的任何解决方案都需要有在其他等效轴承。 我承认,是专门对UTF-8字符串,而不是二进制消息虽然更倾向于将压缩整个字节流的解决方案。

理想情况下,我想保持外部依赖降到最低,但我意识到可能是不切实际的。

更新: 尝试过用SharpZipLib和Python的解码端遇到重复的错误,我真的可以做到与代码具体的建议,是已知的工作,而不是压缩库的一种语言或对方只是建议。

Answer 1:

从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.

我认为它的工作原理反过来也是如此。



Answer 2:

你写了:

同样这两种标准库提供了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()


Answer 3:

看来你对* nix系统。 如果是这样的话,所有其他方法失败了,你可以简单地使用系统库(Mono.Unix.Native),不需要担心找不到合适的.NET库。



Answer 4:

我已经使用zlib的,在过去的.NET,也有是包装本地zlib库提供托管解决方案库。 我需要做类似于你在做什么东西。 我会做直接压缩在内存中较小的传送,并会压缩到一个文件,然后从URL从文件下载文件并解压更大的文件。



文章来源: Easiest way to compress in Python and decompress with decompress C# (and vice versa)