2010-04-08 12 views
45

dokumentacji MSDN mówi mi, co następuje:Klasa GZipStream lub DeflateStream?

Klasa GZipStream wykorzystuje format danych gzip , który obejmuje cykliczny wartość wyboru redundancji do wykrywania danych korupcji. Format danych gzip używa tego samego algorytmu kompresji, co klasy DeflateStream.

Wygląda na to, że GZipStream dodaje dodatkowe dane do wyjścia (w stosunku do DeflateStream). Zastanawiam się, w jakim typie scenariusza konieczne byłoby korzystanie z GZipStream, a nie DeflateStream?

+0

Każdy powód, dla którego nie używasz zip? – Simon

Odpowiedz

63

Deflate to tylko algorytm kompresji. GZip jest w rzeczywistości formatem.

Jeśli używasz GZipStream skompresować plik (i zapisać go z rozszerzeniem .gz), wynik może faktycznie być otwarte przez archiwizujące takich jak WinZip lub narzędzia gzip. Jeśli kompresujesz z DeflateStream, narzędzia te nie rozpoznają pliku.

Jeśli skompresowany plik jest przeznaczony do otwierania za pomocą tych narzędzi, konieczne jest użycie GZipStream zamiast DeflateStream.

Uważam również za istotne, jeśli przesyłasz dużą ilość danych przez niewiarygodne medium (tj. Połączenie internetowe) i nie używasz protokołu korygującego błędy, takiego jak TCP/IP. Na przykład możesz transmitować przez port szeregowy, gniazdo raw lub UDP. W takim przypadku na pewno potrzebujesz informacji CRC osadzonych w formacie GZip w celu zapewnienia poprawności danych.

5

Cóż, całkowicie się myliłem w swojej pierwszej odpowiedzi. Szukałem w kodzie źródłowym Mono i okazało się, że klasa GZipStream faktycznie przekierowuje jego odczytu/zapisu (i prawie każdy inny) zwraca się do właściwych wywołań metod wewnętrznej obiektu DeflateStream:

public override int Read (byte[] dest, int dest_offset, int count) 
{ 
    return deflateStream.Read(dest, dest_offset, count); 
} 

public override void Write (byte[] src, int src_offset, int count) 
{ 
    deflateStream.Write (src, src_offset, count); 
} 

Jedyną różnicą jest że zawsze tworzy obiekt DeflateStream z ustawioną flagą gzip na true. To na pewno nie jest odpowiedź na twoje pytanie, ale może trochę pomoże.

8

GZipStream jest taki sam jak DeflateStream, ale dodaje trochę CRC, aby upewnić się, że dane nie zawierają błędów.

0

Podczas gdy GZipStream wydaje się używać deflateStream do dekompresji, dwa algorytmy nie wydają się być wymienne. Poniższy kod testowy daje wyjątek:

 MemoryStream wtt=new MemoryStream(); 
     using (var gs=new GZipStream(wtt,CompressionMode.Compress,true)) 
     { 
      using (var sw=new StreamWriter(gs,Encoding.ASCII,1024,true)) 
      { 
       sw.WriteLine("Hello"); 
      } 
     } 
     wtt.Position = 0; 
     using (var ds = new DeflateStream(wtt, CompressionMode.Decompress, true)) 
     { 
      using (var sr=new StreamReader(ds,Encoding.ASCII,true,1024,true)) 
      { 
       var txt = sr.ReadLine(); 
      } 
     } 
Powiązane problemy