2009-08-25 4 views
1

Я пытаюсь сжать данные с помощью библиотеки zlib .net. Независимо от содержания несжатой строки, мне кажется, что в raw [] только два байта данных.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(); 
} 

ответ

3

Проблема здесь состоит в том, что на самом деле ZOutputStream пишет некоторую информацию в поток в способе отделки() (который вызывается Close). Метод Close также закрывает базовый поток, поэтому в этой ситуации это не очень полезно.

Изменение кода должно работать:

{ 
    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(); 
} 
Смежные вопросы