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

2024-04-20 11:01:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的初步研究还没有发现任何明显兼容这两个标准库的东西。Python有一个zlib库,但我不能使用C#的DeflateStream或GZipStream(因为它们需要一个我没有的外部DLL),而且它似乎不能与SharpZipLib的ZipOutputStream(给出“error-3-incorrect header”响应)一起工作。(那些不使用Mono的人可能会更幸运-见下面邓肯的答案。)

我很想知道在这个通信链路上实现压缩的简单方法,要记住,任何可能容易用一种语言实现的解决方案都需要另一种语言实现。我会接受一个专门针对UTF-8字符串而不是二进制消息的解决方案,尽管首选的是压缩整个字节流。在

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

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


Tags: 字符串程序ip服务器语言消息客户机字节
3条回答

你写道:

Similarly both standard libraries offer gzip compression but Python expects to use file in this case, which is not practical.

事实上不是这样的。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()

看来你是在尼克斯系统上。如果是这样,并且所有其他方法都失败了,您可以简单地使用系统库(单声道.Unix.Native)不需要担心如何找到合适的.Net库。在

SharpZipLib和Python库中的BZip2对我很有用。以下是我测试的内容和方法:

首先,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:

^{pr2}$

接下来,运行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.

我想它也会反过来的。在

相关问题 更多 >