example decompress comprimir archivo c# .net-3.5 compression zlib

decompress - ziparchive c#



Guardar archivo de un byte[] en C#NET 3.5 (5)

Mi cliente TCP recibe una imagen dentro de un paquete. La imagen está comprimida con zlib. La tarea es descomprimir la imagen y ponerla en el formulario.

Estoy planeando guardar la imagen comprimida en el directorio actual, descomprimirla y cargar el archivo descomprimido en el formulario.

El primer problema viene con guardar el archivo (comprimido). El zlib puede guardarlo descomprimido.

El siguiente código carga el archivo comprimido y lo guarda después de la descompresión.

private void decompressFile(string inFile, string outFile) { System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create); zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream); System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open); try { CopyStream(inFileStream, outZStream); } finally { outZStream.Close(); outFileStream.Close(); inFileStream.Close(); } } public static void CopyStream(System.IO.Stream input, System.IO.Stream output) { byte[] buffer = new byte[2000]; int len; while ((len = input.Read(buffer, 0, 2000)) > 0) { output.Write(buffer, 0, len); } output.Flush(); }

¿Cómo pasar el byte [] array directamente a esa función? Estoy planeando guardarlo como comprimido y luego llamar a la función con la ubicación del archivo comprimido, pero no sé ni cómo guardar un archivo desde una matriz de bytes [] ni una manera de pasar la matriz de bytes [] como el archivo de entrada.

Cualquier ayuda será muy apreciada.

Gracias.


Además de lo que ya han dicho todos los demás, también sugeriría que use cláusulas de "uso", ya que todos esos objetos se implementan como IDisposable.

using(FileStream outFileStream = new ...) using(ZOutputStream outZStream = new ...) using(FileStream inFileStream = new ...) { CopyStream(inFileStream, outZStream); }


Pegue la matriz de bytes que recibió en un MemoryStream y MemoryStream / descomprímala sobre la marcha sin usar archivos temporales.


Puedes probar este código

private void t1() { FileStream f1 = new FileStream("C://myfile1.txt", FileMode.Open); int length = Convert.ToInt16(f1.Length); Byte[] b1 = new Byte[length]; f1.Read(b1, 0, length); File.WriteAllBytes("C://myfile.txt",b1); f1.Dispose(); }


Utilice el método estático vacío System.IO.File.WriteAllBytes (cadena de ruta, bytes [] bytes).

byte[] buffer = new byte[200]; File.WriteAllBytes(@"c:/data.dmp", buffer);


public static void SaveFile(this Byte[] fileBytes, string fileName) { FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite); fileStream.Write(fileBytes, 0, fileBytes.Length); fileStream.Close(); }