2013-05-14 3 views
0

DEFLATE 알고리즘과 관련된 질문이지만 gzip 및 zlib와 관련된 질문입니다.플러시 포인트에서 DEFLATE 압축 해제 재개

내가 알고있는 gzip 파일에 파일에 여러 개의 플러시 포인트가 있다고 가정합니다. 일부는 Z_SYNC_FLUSH 및 다른 Z_FULL_FLUSH로 만들어집니다. 파일을 스캔하면 0000ffff의 패턴을 즉시 따르기 때문에 모든 플러시 포인트를 찾을 수 있습니다.

압축 해제에 필요한 모든 정보를 사용할 수 있기 때문에 압축 해제를 Z_FULL_FLUSH 지점에서 다시 시작할 수 있음을 알고 있습니다 (IE : 사전 재설정 됨). 그러나 Z_SYNC_FLUSH에서 압축을 풀려고하면 일반적으로 "zlib.error : 오류 -3 압축을 풀는 동안 : 잘못된 거리"라는 오류가 발생합니다.

질문은 이것이다 :

  1. 가 제대로 "너무 먼 거리"로 그 블록 및 후속 블록
  2. 실패를 압축 해제 오류
  3. : 내가하는 Z_SYNC_FLUSH 지점에서 압축 해제하려고하면 나도 보장입니다

즉, 나는 나쁜 데이터로 조용히 압축을 풀지 않을 것이라고 확신합니다 (gzip의 끝에서 CRC32 검사에 대해 말하는 것이 아니라 zlib가 큰소리로 불평 할 것인가)?

가정 :

  1. 내가 완벽하게 세척 포인트를 식별 할 수 있음을 가정한다. 무작위 비트를 동기화 마커로 오인하지 않고 패턴이 유형 0 블록에 표시되는 것처럼 행동합시다. 이것은 비현실적이지만 사실이라고 가정합니다.
  2. 파일이 손상되지 않았으며 항상 합법적 인 gzip 파일이라고 가정합니다.

답변

1

Z_SYNC_FLUSH로 인해 거리가 너무 먼 오류가 발생하지 않는 후속 스트림이 발생하면 이는 우연히 Z_FULL_FLUSH와 동일하고 구별 할 수 없습니다.

나는 이런 일이 자주 일어나기를 기대하지 않습니다.

+0

감사합니다. 이것은 내가 의심했던 것이다. – DSnet

+0

후속 질문으로 ... 파일을 통해 중간에 Z_SYNC_FLUSH 지점을 식별하는 상황에서 정확히 어떻게 32KiB의 압축되지 않은 데이터가 있었는지 정확히 알았다면 inflateSetDictionary()를 사용하여 압축을 풀 수 있습니까? 에? – DSnet

+0

예. .......... –