압축 된 이진 파일을 읽으려고하는데 압축 풀기가 실패했습니다. 이 파일은 기본적으로 몇 가지 다이렉트 헤더 정보이며 MSZIP 형식의 데이터 (즉, 2 바이트는 blockSize
이고 2 바이트는 "매직 넘버"이며 blockSize
수축 된 바이트가 있고 더 이상 데이터가 없을 때까지 반복합니다) 그래서 각 블록에 대해 압축 된 바이트를 가져 와서 이렇게 수축시키는 것입니다.MSZIP 형식의 데이터 압축 중
internal static byte[] DecompressBlock(byte[] data) {
var result = new List<byte>();
var ms = new MemoryStream(data);
var ds = new DeflateStream(ms, CompressionMode.Decompress);
var newStream = new MemoryStream();
ds.CopyTo(newStream);
ds.Flush();
ds.Close();
return newStream.GetBuffer();
}
첫 번째 블록이 예상대로 압축됩니다. 후속 블록은 오른쪽으로 팽창 된 크기이지만 겉보기에 무작위로, 일부 바이트는 0이 아니며 대개 4-12의 그룹으로되어 있습니다.
동일한 기록 버퍼를 유지하면서 압축 된 데이터의 다른 블록을 어떻게 수축시킬 수 있습니까?
업데이트 : MSZIP 압축처럼 보이는이 블록은 별도의 수축 작동 결과이지만 "이력 버퍼"는 유지됩니다. deflatestream
이 처리 할 수 있는지 여부는 알 수 없습니다. . 실제 질문 업데이트
고마워요! 나는 질문을 업데이트하기 전에 이것을 보지 못했습니다. 나는 당신이 이것을 C#에서 할 수있는 방법을 알고 있다고 생각하지 않습니까? –
Deflate 클래스가 zlib의 deflateSetDictionary() 함수에 대한 액세스를 제공하는 것으로 보이지 않습니다. zlib를 직접 사용해야합니다. –
실제로, zlib을 직접 사용한다면,이 목적을 위해 추가 한 문서화되지 않은'deflateResetKeep()'함수를 사용할 수 있습니다. 새로운 수축 흐름을 시작하지만 그 상태를 사용하여 방금 완료 한 수축 물로부터 사전을 유지합니다. 상응하는'inflateResetKeep()'도 있습니다. –