2010-04-08 22 views
45

Các tài liệu MSDN nói với tôi như sau:GZipStream hoặc DeflateStream class?

Lớp GZipStream sử dụng định dạng dữ liệu gzip , trong đó bao gồm một dư thừa giá trị kiểm tra theo chu kỳ để phát hiện hỏng dữ liệu. Định dạng dữ liệu gzip sử dụng cùng một thuật toán nén như lớp DeflateStream.

Dường như GZipStream thêm một số dữ liệu bổ sung vào đầu ra (liên quan đến DeflateStream). Tôi tự hỏi, trong trường hợp nào thì kịch bản nào là cần thiết để sử dụng GZipStream chứ không phải DeflateStream?

+0

Bất kỳ lý do nào bạn không sử dụng zip? – Simon

Trả lời

63

Làm lệch hướng chỉ là thuật toán nén. GZip thực sự là một định dạng.

Nếu bạn sử dụng GZipStream để nén tệp (và lưu nó với phần mở rộng .gz), kết quả thực sự có thể được mở bằng trình lưu trữ như WinZip hoặc công cụ gzip. Nếu bạn nén bằng DeflateStream, những công cụ đó sẽ không nhận ra tệp.

Nếu tệp nén được thiết kế để mở bằng các công cụ này, thì điều quan trọng là sử dụng GZipStream thay vì DeflateStream. Tôi cũng sẽ xem xét điều cần thiết nếu bạn đang chuyển một lượng lớn dữ liệu qua một phương tiện không đáng tin cậy (tức là kết nối internet) và không sử dụng giao thức sửa lỗi như TCP/IP. Ví dụ: bạn có thể đang truyền qua cổng nối tiếp, ổ cắm thô hoặc UDP. Trong trường hợp này, bạn chắc chắn sẽ muốn thông tin CRC được nhúng trong định dạng GZip để đảm bảo rằng dữ liệu là chính xác.

5

Vâng, tôi đã hoàn toàn sai trong câu trả lời đầu tiên của mình. Tôi đã nhìn lên trong mã nguồn Mono và thấy rằng GZipStream lớp thực sự chuyển hướng đọc của nó/ghi (và gần như bất kỳ khác) gọi một cuộc gọi phù hợp của phương pháp của một đối tượng DeflateStream nội bộ:

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

Sự khác biệt duy nhất, là rằng nó luôn tạo một đối tượng DeflateStream với cờ gzip được đặt thành true. Đây chắc chắn không phải là câu trả lời cho bạn, nhưng có lẽ nó sẽ giúp ích một chút.

8

GZipStream giống với DeflateStream nhưng nó thêm một số CRC để đảm bảo dữ liệu không có lỗi.

0

Trong khi GZipStream dường như đang sử dụng DeflateStream để giải nén, hai thuật toán dường như không thể hoán đổi cho nhau. Mã thử nghiệm sau sẽ cung cấp cho bạn một ngoại lệ:

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