2010-01-22 6 views
11

je dois zip et décompressez chaînezip et décompressez chaîne avec Deflate

Voici le code:

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(); 
     } 
} 

et

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()); 
     } 
} 

Il semble qu'il y ait erreur dans la méthode UnZipStr. Quelqu'un peut-il m'aider?

+4

Obtenez-vous une erreur de compilation, ou une exception, ou quoi? Pouvez-vous fournir plus de détails sur "l'erreur" s'il vous plaît? – Nick

Répondre

24

Il existe deux problèmes distincts. Tout d'abord, dans ZipStr vous devez vider ou fermer le StreamWriter et fermer le DeflateStream avant de lire le MemoryStream.

Deuxièmement, dans UnZipStr, vous construisez votre chaîne de résultats à partir des octets compressés dans inputStream. Vous devriez retourner le résultat de reader.ReadToEnd() à la place.

Il serait également judicieux de spécifier le codage de chaîne dans les constructeurs StreamWriter et StreamReader.

Essayez plutôt le code suivant:

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 Il y avait aussi un problème avec 'ZipStr'. J'ai mis à jour ma réponse. –

+0

@PhilRoss Merci beaucoup, mais j'ai une question. Comment faire cela multithread? En utilisant TPL? – IamStalker

Questions connexes