2011-05-20 8 views
5

He estado leyendo durante un tiempo acerca de GZipStream y su método Write. Lo que intento hacer es convertir los datos comprimidos de la secuencia y ponerlos en una matriz de bytes. Te dejaré mi código a continuación, ya que creo que será de gran ayuda.GZipStream.Write Método

public static void Compress(byte[] fi) 
{ 
    using (MemoryStream inFile = new MemoryStream(fi)) 
    using (FileStream outFile = File.Create(@"C:\Compressed.exe")) 
    using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress)) 
    { 
     inFile.CopyTo(Compress); 
    } 
} 

En lugar de escribir en un archivo en mi disco, me gustaría escribir los datos comprimidos en una matriz de bytes, y luego devolver la matriz de bytes (suponiendo que hice esta función, por supuesto).

Respuesta

6

Puede usar simplemente usar otro MemoryStream y su ToArray method.

public static byte[] Compress(byte[] fi) 
{ 
    using (MemoryStream outFile = new MemoryStream()) 
    { 
     using (MemoryStream inFile = new MemoryStream(fi)) 
     using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress)) 
     { 
      inFile.CopyTo(Compress); 
     } 
     return outFile.ToArray(); 
    } 
} 
+0

De hecho, estoy viniendo a través de un pequeño error cuando se utiliza el MemoryStream. Mi versión anterior produjo un archivo comprimido de 2.62kb, pero cuando se usa la secuencia de memoria, la versión comprimida es de 2.61 kb. Cuando descomprimo el archivo, el resultado se rompe (no se ejecutará). ¿Alguna sugerencia? –

+1

@Evan, tienes razón. Parece que 'GZipStream' escribe algo de información final sobre la transmisión cuando está desechando, por lo que primero debe desecharla y solo luego devolver el resultado. Ver respuesta actualizada. – svick

+0

OH MY GOSH - ¡funciona! Tengo que preguntar ... ¿cómo encontraste esa información ... He pasado casi 2 horas tratando de hacer que esto funcione ahora? Qué gran sentimiento, tan cerca. Muchas gracias –

3

de uno de mis bibliotecas de extensión

public static string Compress(this string s) 
    { 
     byte[] bytesToEncode = Encoding.UTF8.GetBytes(s); 
     return Convert.ToBase64String(bytesToEncode.Compress()); 
    } 

    public static byte[] Compress(this byte[] bytesToEncode) 
    { 
     using (MemoryStream input = new MemoryStream(bytesToEncode)) 
     using (MemoryStream output = new MemoryStream()) 
     { 
      using (System.IO.Compression.GZipStream zip = new System.IO.Compression.GZipStream(output, System.IO.Compression.CompressionMode.Compress)) 
      { 
       input.CopyTo(zip); 
      } 
      return output.ToArray(); 
     } 
    } 

    public static string Explode(this string s) 
    { 
     byte[] compressedBytes = Convert.FromBase64String(s); 
     return Encoding.UTF8.GetString(compressedBytes.Explode()); 
    } 

    public static byte[] Explode(this byte[] compressedBytes) 
    { 
     using (MemoryStream input = new MemoryStream(compressedBytes)) 
     using (MemoryStream output = new MemoryStream()) 
     { 
      using (System.IO.Compression.GZipStream zip = new System.IO.Compression.GZipStream(input, System.IO.Compression.CompressionMode.Decompress)) 
      { 
       zip.CopyTo(output); 
      } 
      return output.ToArray(); 
     } 
    } 
+0

Buena solución Me gusta el uso de un método de extensión para ello. ¡Gracias! – Kelly

Cuestiones relacionadas