2010-01-22 19 views
11

que necesito para comprimir y descomprimir cadenacomprimir y descomprimir cadena con desinfla

Aquí está el código:

public static byte[] ZipStr(String str) 
{ 
    using (MemoryStream output = new MemoryStream()) 
    using (DeflateStream gzip = new DeflateStream(output, CompressionMode.Compress)) 
    using (StreamWriter writer = new StreamWriter(gzip)) 
     { 
       writer.Write(str); 
       return output.ToArray(); 
     } 
} 

y

public static string UnZipStr(byte[] input) 
{ 
    using (MemoryStream inputStream = new MemoryStream(input)) 
    using (DeflateStream gzip = new DeflateStream(inputStream, CompressionMode.Decompress)) 
    using (StreamReader reader = new StreamReader(gzip)) 
     { 
     reader.ReadToEnd(); 
     return System.Text.Encoding.UTF8.GetString(inputStream.ToArray()); 
     } 
} 

Parece que hay un error en el método UnZipStr. ¿Puede alguien ayudarme?

+4

¿Usted está consiguiendo un error del compilador, o una excepción, o qué? ¿Puede proporcionar más detalles sobre el "error" por favor? – Nick

Respuesta

24

Hay dos problemas separados. En primer lugar, en ZipStr debe vaciar o cerrar el StreamWriter y cerrar el DeflateStream antes de leer desde el MemoryStream.

En segundo lugar, en UnZipStr, está construyendo su cadena de resultados a partir de los bytes comprimidos en inputStream. Debería devolver el resultado de reader.ReadToEnd() en su lugar.

También sería una buena idea especificar la codificación de cadena en los constructores StreamWriter y StreamReader.

Prueba el código siguiente en su lugar:

public static byte[] ZipStr(String str) 
{ 
    using (MemoryStream output = new MemoryStream()) 
    { 
     using (DeflateStream gzip = 
      new DeflateStream(output, CompressionMode.Compress)) 
     { 
      using (StreamWriter writer = 
       new StreamWriter(gzip, System.Text.Encoding.UTF8)) 
      { 
       writer.Write(str);   
      } 
     } 

     return output.ToArray(); 
    } 
} 

public static string UnZipStr(byte[] input) 
{ 
    using (MemoryStream inputStream = new MemoryStream(input)) 
    { 
     using (DeflateStream gzip = 
      new DeflateStream(inputStream, CompressionMode.Decompress)) 
     { 
      using (StreamReader reader = 
       new StreamReader(gzip, System.Text.Encoding.UTF8)) 
      { 
       return reader.ReadToEnd(); 
      } 
     } 
    } 
} 
+0

@Mikhail También hubo un problema con 'ZipStr'. He actualizado mi respuesta. –

+0

@PhilRoss Muchas gracias, pero tengo una pregunta. ¿Cómo hacer esto multiproceso? ¿Usando TPL? – IamStalker

Cuestiones relacionadas