2009-08-25 3 views
1

zlib .net 라이브러리를 사용하여 데이터를 압축하려고합니다. 압축되지 않은 문자열의 내용에 관계없이 나는 원시 []에서 2 바이트의 데이터 만 얻는 것만 보입니다. 여기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 메서드는 기본 스트림도 닫습니다. 따라서이 상황에서는별로 사용되지 않습니다.

다음에 코드 변경 작업을해야합니다 :

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