2009-08-25 5 views
1

J'essaie de compresser des données en utilisant la bibliothèque zlib .net. Indépendamment du contenu de la chaîne décompressée, je ne trouve que deux octets de données dans le brut [].décompression ZLib

{ 
    string uncompressed = "1234567890"; 
    byte[] data = UTF8Encoding.Default.GetBytes(uncompressed); 

    MemoryStream input = new MemoryStream(data); 
    MemoryStream output = new MemoryStream(); 
    Stream outZStream = new ZOutputStream(output,zlibConst.Z_DEFAULT_COMPRESSION); 

    CopyStream(input, outZStream); 

    output.Seek(0, SeekOrigin.Begin); 
    byte[] raw = output.ToArray(); 
    string compressed = Convert.ToBase64String(raw); 
} 

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

Répondre

3

Le problème ici est que le ZOutputStream écrit en fait certaines des informations dans le flux dans la méthode finish() (qui est appelé par Close). La méthode Close ferme également le flux de base, ce qui n'est pas très utile dans cette situation.

Modification du code à ce qui suit devrait fonctionner:

{ 
    string uncompressed = "1234567890"; 
    byte[] data = UTF8Encoding.Default.GetBytes(uncompressed); 

    MemoryStream input = new MemoryStream(data); 
    MemoryStream output = new MemoryStream(); 
    ZOutputStream outZStream = new ZOutputStream(output,zlibConst.Z_DEFAULT_COMPRESSION); 

    CopyStream(input, outZStream); 

    outZStream.finish(); 

    output.Seek(0, SeekOrigin.Begin); 
    byte[] raw = output.ToArray(); 
    string compressed = Convert.ToBase64String(raw); 
} 

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