2009-05-13 2 views
3

나는 그것을 얻지 못한다. 나는 수년 동안 비슷하거나 동일한 접근법을 사용해 왔지만 결코 경험하지 못했습니다.GZip 왕복으로 1 바이트 이상 잘라 내기

오늘까지 GZip 왕복으로 인해 1 바이트 이상이 잘 리거나 데이터가 왜곡되어 표시되는 이유가 있습니다.

다른 테스트가 영향을 미치지 않는지 확인하기위한 간단한 테스트를 작성했습니다.

'길이 불일치'로 인해 항상 실패합니다.

내가 미쳤다고 누군가 나를 따라 줄 수 있습니까? :)

감사

leppie

TEST는

using System; 
using System.Diagnostics; 
using System.IO; 
using System.IO.Compression; 

class Program 
{ 
    const int BUFFER_SIZE = 8192; 

    static void Main(string[] args) 
    { 
    var filename = args[0]; 
    var filedata = File.ReadAllBytes(filename); 
    var cmp = Compress(filedata); 
    var dec = Decompress(cmp); 

    Assert(filedata, dec); 

    Console.ReadLine(); 
    } 

    static void Assert(byte[] orig, byte[] data) 
    { 
    if (orig.Length != data.Length) 
    { 
     Debug.Fail("length mismatch"); 
    } 
    for (int i = 0; i < orig.Length; i++) 
    { 
     Debug.Assert(orig[i] == data[i], "data mismatch"); 
    } 
    } 

    static byte[] Compress(byte[] data) 
    { 
    var input = new MemoryStream(data); 
    var output = new MemoryStream(); 

    var s = new GZipStream(output, CompressionMode.Compress); 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    int read = 0; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     s.Write(buffer, 0, read); 
    } 

    return output.ToArray(); 
    } 

    static byte[] Decompress(byte[] data) 
    { 
    var input = new MemoryStream(data); 
    var s = new GZipStream(input, CompressionMode.Decompress); 

    var output = new MemoryStream(); 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    int read = 0; 
    while ((read = s.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, read); 
    } 

    return output.ToArray(); 
    } 
} 

나는 다른 버퍼 크기, 모두 같은 결과도 제대로 스트림을 닫는 그것을 시도했다.

답변

3

확인을 클릭하면 문제가 발견되었습니다.

바이트를 검색하기 전에 압축 스트림을 닫아야합니다.

예 :

s.Close(); 
return output.ToArray();