[C#] La forma más fácil de comprimir en Python y descomprimir con descompresión C # (y viceversa)


Answers

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()
Question

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.




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.