2011-05-20 1 views
5

Je lis depuis peu de temps sur GZipStream et sa méthode Write. Ce que je tente de faire est de convertir les données compressées du flux et le mettre dans un tableau d'octets. Je vais vous laisser avec mon code ci-dessous car je crois que cela va aider de manière significative.GZipStream.Write Méthode

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

Plutôt que d'écrire un fichier sur mon disque, je voudrais écrire les données compressées sur un tableau d'octets, puis retourner le tableau d'octets (en supposant que je fait cette fonction bien sûr).

Répondre

6

Vous pouvez simplement utiliser un autre MemoryStream et 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

Je viens en fait à travers une légère erreur lors de l'utilisation du MemoryStream. Mon ancienne version a produit un fichier compressé de 2,62 Ko, mais lors de l'utilisation du flux mémoire, la version compressée est de 2,61 Ko. Quand je décompresse le fichier, le résultat est cassé (ne fonctionnera pas). Aucune suggestion? –

+1

@Evan, vous avez raison. Il semble que 'GZipStream' écrit des informations finales dans le flux quand il est en train de se défaire, donc vous devez d'abord le jeter et ensuite seulement retourner le résultat. Voir la mise à jour – svick

+0

OH MY GOSH - ça marche! Je dois demander ... comment avez-vous trouvé cette information ... J'ai passé près de 2 heures à essayer de faire ce travail maintenant! Quel sentiment génial - si proche. Merci beaucoup –

3

D'un de mes bibliothèques d'extension

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

Belle solution J'aime l'utilisation d'une méthode d'extension pour cela. Merci! – Kelly

Questions connexes