.net video - La forma más fácil de comprimir en Python y descomprimir con descompresión C#(y viceversa)




instalar abre (5)

Parece que estás en los sistemas * nix. Si ese es el caso y todos los otros métodos fallaron, simplemente puede usar las bibliotecas del sistema (Mono.Unix.Native) y no necesita preocuparse por encontrar las bibliotecas .Net correctas.

Tengo un programa con un cliente basado en Mono C # y un servidor Python, que se comunican a través de un socket TCP / IP. Los mensajes usan un formato mayormente binario, pero la parte más grande de cada mensaje generalmente está integrada en cadenas UTF-8 (en inglés). Cada mensaje es típicamente corto (menos de 100 bytes) pero algunos pueden ser más largos (hasta 64K). Se intercambian muchos datos y me gustaría reducir el tamaño de los mensajes y el uso del ancho de banda al comprimir los datos cuando se transmiten.

Mi investigación inicial no ha encontrado nada que sea obviamente compatible en las 2 bibliotecas estándar. Python tiene una librería zlib pero no puedo usar C ++ ' DeflateStream o GZipStream (ya que requieren una DLL externa que no tengo disponible) y no parece funcionar con ZipOutputStream de SharpZipLib (dando "error -3 - incorrecto respuestas del encabezado). (Aquellos que no usan Mono podrían tener más suerte; consulte la respuesta de Duncan a continuación).

Me interesaría conocer formas sencillas de habilitar la compresión sobre este enlace de comunicaciones, teniendo en cuenta que cualquier solución que pueda ser fácil de implementar en un idioma debe tener un equivalente en el otro. Aceptaría una solución especializada para las cadenas UTF-8 en lugar de los mensajes binarios, aunque la preferencia sería comprimir todo el flujo de bytes.

Idealmente, me gustaría mantener las dependencias externas al mínimo, pero me doy cuenta de que puede que no sea práctico.

ACTUALIZACIÓN: habiendo probado con SharpZipLib y encontrado errores repetidos en el lado de decodificación de Python, realmente podría hacer con sugerencias concretas con código que se sabe que funciona en lugar de solo sugerencias de bibliotecas de compresión para un idioma u otro.


El BZip2 de SharpZipLib y la biblioteca de Python funcionó para mí. Esto es lo que probé y cómo:

Primero, el programa C # (haciendo referencia a 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);
                }
            }
        }
    }

}

Entonces Python:

from bz2 import BZ2File
import sys

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

A continuación, se ejecuta el programa C #. Y después de eso:

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

Supongo que funciona al revés también.


He usado zlib para .net en el pasado y también hay bibliotecas que envuelven la biblioteca zlib nativa para proporcionar una solución administrada. Necesitaba hacer algo similar a lo que estás haciendo. Me gustaría hacer la compresión directamente en la memoria para transferencias más pequeñas y zip a un archivo y luego descargar el archivo de una url y descomprimir desde el archivo para archivos mucho más grandes.


Tu escribiste:

De manera similar, ambas bibliotecas estándar ofrecen compresión gzip pero Python espera usar el archivo en este caso, lo que no es práctico.

Eso no es verdad. La clase gzip.GZipFile() Python toma un filename o un fileobj . Si desea usar una cadena simplemente use un objeto StringIO como 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()

En general, la "estructura especializada" en realidad ES un estado actual sensible de un objeto, con sus propios métodos.

class Some3SpaceThing(object):
  def __init__(self,x):
    self.g(x)
  def g(self,x):
    self.y0 = x + 1
    self.y1 = x * 3
    self.y2 = y0 ** y3

r = Some3SpaceThing( x )
r.y0
r.y1
r.y2

Me gusta encontrar nombres para estructuras anónimas donde sea posible. Los nombres significativos hacen las cosas más claras.







c# .net python mono compression