2008-09-16 6 views

답변

9

:

이 클래스 파일 무손실 압축 및 압축 해제를위한 산업 표준 알고리즘을 사용 GZIP 데이터 포맷을 나타낸다. zlib FAQ에서

: 다른 한편으로는 ZLIB에서

GZ의 * 기능은 GZIP 형식을 사용합니다.

그래서 zlib와 GZipStream은 gzip 형식을 처리하기 위해 zlib 함수를 사용하는 경우에만 상호 운용이 가능해야합니다.

System.IO.Compression.Deflate 및 ZLIB 보도 상호 운용되지 않습니다.

zip 파일을 처리해야하는 경우 (그렇지는 않지만 다른 사람이 필요할 수 있음) SharpZipLib 또는 다른 타사 라이브러리를 사용해야합니다.

+1

zip 파일은 zlib 압축 파일과 동일하지 않습니다 (압축 알고리즘은 동일하지만 헤더는 동일하지 않음) –

+0

맞습니다. 나는 나의 응답을 편집 할 것이다. –

+21

: zlib 및 DeflateStream과 관련하여 "상호 ​​운용성이 없다"고 전하면서. 그들은 실제로 상호 운용이 불가능합니다. 이 공간을 다루는 IETF RFC는 ZLIB의 경우 1950, DEFLATE의 경우 1951, GZIP의 경우 1952입니다. Deflate는 압축 알고리즘입니다. ZLIB 및 GZIP는 압축 된 스트림에 적용되는 메타 데이터 (별명 "헤더")를 정의하는 고유 한 형식입니다. zlib 라이브러리는 ZLIB와 GZIP를 모두 구현합니다. 흥미롭게 만들기 위해 ZLIB와 GZIP 모두 DEFLATE를 압축 메커니즘으로 사용할 수 있습니다. DeflateStream 클래스는 헤더없는 스트림을 생성합니다. 우리 모두 혼란스럽지 않습니다. – Cheeso

2

그들은 단지 ZLIB를 사용하거나 수축 알고리즘 데이터 압축하지만, 일부 특정 파일 포맷에 대한 출력을 제공하지 않는다. 즉, 스트림을 하드 드라이브에 저장하면 파일 헤더 (매직 번호 등)가 스트림에 포함되지 않으므로 일부 응용 프로그램 (gzip 또는 winrar)을 사용하여 스트림을 열 수 없게됩니다. 직접 작성하십시오.

0

나는 안드레아스에 동의합니다. 외부 도구에서 파일을 열 수는 없지만 도구에서 스트림을 예상하는 경우이를 사용할 수 있습니다. 또한 동일한 압축 클래스를 사용하여 파일을 다시 압축 할 수 있습니다.

3

gzip은 체크섬과 길이와 같은 일부 헤더/푸터 데이터입니다. 따라서 한 가지 메소드가 다른 스트림의 스트림을 사용할 수 있다는 점에서 호환되지 않지만 동일한 압축 알고리즘을 사용합니다.

MSDN 가입일 System.IO.Compression.GZipStream 약
6

.NET XmlSerializer의 출력을 압축하기 위해 GZipStream을 사용했으며 gunzip (cygwin에서), winzip 및 다른 GZipStream을 사용하여 결과를 압축 해제하는 데 완벽하게 작동했습니다. Cygwin에서 실제로 차이가 있음을 알 수있는 '파일'유틸리티를 사용하여 C#을

FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); 
using (Stream input = new GZipStream(fs, CompressionMode.Decompress)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(MyDataType)); 
    myData = (MyDataType) serializer.Deserialize(input); 
} 

에 압축을, 그리고

FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write); 
using (GZipStream gzStream = new GZipStream(fs, CompressionMode.Compress)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(MyDataType)); 
    serializer.Serialize(gzStream, myData); 
} 

:

참고로

, 여기에 내가 코드에서 무슨 짓을했는지 GZipStream과 GNU Gzip으로 압축 된 동일한 파일 (아마도이 ​​헤더에는 다른 헤더 정보가 있습니다). 그러나이 차이점은 실제로 중요하지 않습니다.

+1

는 매력처럼 작동합니다! 성능 테스트를 위해 사용하고있는 큰 데이터 세트가 현저한 성능 손실없이 55MB에서 7.5MB로 압축되었습니다. P. "file"의 이름이 "file.gz"로 바뀌면, 그것은 완벽하게 유효한 아카이브 파일이됩니다. 아카이브 도구를 사용하여 내용을 수정할 수도 있으며, 방법을 사용하여 직렬화 할 수도 있습니다. – Soonts

14

DotNetZip에는 RFC 1950, 1951 및 1952를 처리하기 위해 DeflateStream, ZlibStream 및 GZipStream이 포함되어 있습니다. 모두 DEFLATE 알고리즘을 사용하지만 프레이밍 및 헤더 바이트는 각각 다릅니다.

는 장점으로, DotNetZip의 스트림은 스트림 내장에 대해보고 압축에서 anomaly of expanding data size, 전시하지 않습니다.또한 ZlibStream이 내장되어 있지 않은 반면, DotNetZip은 zlib과의 좋은 상호 작용을 위해 ZlibStream을 제공합니다.

12

이 문제는 Git 개체에서 발생했습니다. 이 경우 Zlib 헤더가있는 수축 된 모양으로 객체를 저장합니다.이 객체는 RFC 1950에 문서화되어 있습니다. 당신은 포함 된 파일하여 호환되는 방울을 만들 수 있습니다 0x78 0x01

  • CM = 8 = 폐

    • 두 헤더 바이트 (RFC 1950에서 CMF와 FLG)의 값으로를
    • CINFO = 7 이 헤더
  • 의 출력 = 창으로 32Kb
  • FCHECK = 1 = 비트 체크섬 DeflateStream, 빅 엔디안 형식으로 입력 데이터의 C# DeflateStream
  • Adler32 체크섬 (MSB 먼저)

나는 내 자신의 애들러 구현

public class Adler32Computer 
{ 
    private int a = 1; 
    private int b = 0; 

    public int Checksum 
    { 
     get 
     { 
      return ((b * 65536) + a); 
     } 
    } 

    private static readonly int Modulus = 65521; 

    public void Update(byte[] data, int offset, int length) 
    { 
     for (int counter = 0; counter < length; ++counter) 
     { 
      a = (a + (data[offset + counter])) % Modulus; 
      b = (b + a) % Modulus; 
     } 
    } 
} 

을했다 그리고 그 정도를 꽤했다 .

1

System.IO.Compression.DeflateStream 클래스는 .NET Framework 4.5부터 zlib 라이브러리를 사용합니다. 에서

클래스의 MSDN article :

이 클래스는 무손실 파일 압축 및 압축 해제를위한 업계 표준 알고리즘 인 공기를 빼다 알고리즘을 나타냅니다. .NET Framework 4.5부터는 DeflateStream 클래스가 zlib 라이브러리를 사용합니다. 결과적으로 더 나은 압축 알고리즘과 대부분의 경우 이전 버전의 .NET Framework에서 제공하는 것보다 작은 압축 파일을 제공합니다.