2009-09-03 2 views
10

다른 응용 프로그램으로 압축 된 데이터의 압축을 풀어야하는 응용 프로그램을 작성하고 있습니다.이 파일은 내 제어 밖에 있으며 소스 코드를 변경할 수 없습니다. 제작자 응용 프로그램은 zlib를 사용하여 z_stream 메커니즘을 사용하여 데이터를 압축합니다. 그것은 Z_FULL_FLUSH를 빈번하게 사용합니다 (제 생각에는 너무 자주,하지만 그것은 또 다른 문제입니다). 이 타사 응용 프로그램은 자체 데이터를 압축 할 수도 있으므로 데이터 자체가 정확하다는 확신이 듭니다. 내 테스트에서 zlib 압축 해제 실패

, 나는 (16 진수로) 다음과 같은 간단한 텍스트 파일을 압축하기 위해 타사 응용 프로그램을 사용하고 있습니다 :

48 65 6c 6c 6f 20 57 6f 72 6c 64 21 0d 0a

내가 응용 프로그램에서받은 압축 된 바이트를 다시 (같이 에서 16 진수) : 나는 동일한 데이터를 시도하고 압축하면

78 9c f2 48 cd c9 c9 57 08 cf 2f ca 49 51 e4 e5 02 00 00 00 ff ff

, 내가 얻을 매우 유사한 결과 :

78 9c f3 48 cd c9 c9 57 08 cf 2f ca 49 51 e4 e5 02 00 24 e9 04 55

난 볼 수있는 두 가지 차이점이있다 :

먼저, 네번째 바이트는 오히려 F3보다 F2는이므로 DEFLATE은 "마지막 블록이"비트가 설정되어 있지 않다. 스트림 인터페이스는 들어오는 데이터의 끝이 언제 알 수 없기 때문에이 비트를 설정하지 않는다고 가정합니다.

마지막으로 외부 데이터의 마지막 4 바이트는 00 00 FF FF이고 내 테스트 데이터는 24 E9 04 55입니다. 주위에 나는이 동기화 또는 전체 높이의 서명입니다 해당 페이지

http://www.bolet.org/~pornin/deflate-flush.html

에 발견하여 검색을.

decompress() 함수를 사용하여 데이터를 압축 해제하면 모든 것이 완벽하게 작동합니다. 그러나 외부 데이터의 압축을 풀 때 decompress() 함수 호출이 실패하여 Z_DATA_ERROR의 반환 코드와 함께 손상된 데이터를 나타냅니다.

  1. 내가 z_stream 방법으로 압축 된 데이터를 압축 해제 기능을 ZLIB "압축 해제"를 사용할 수 있어야합니다 :

    나는 몇 가지 질문이?

  2. 위 예제에서 마지막 4 바이트의 의미는 무엇입니까? 외부 적으로 압축 된 데이터 스트림과 내 테스트 데이터 스트림이 동일한 길이라면, 마지막 4 바이트는 무엇을 나타내는가?

건배 zlib의 저자에

+0

나는 이것에 대해 아무런 단서가 없지만 질문에 추가하지 않은 정보 중 잠재적으로 관련이있는 부분은 zlib 압축 해제가 정확히 어떻게 실패하는지입니다. –

+0

감사합니다. – Thomi

답변

7

덕분에, 내가 대답을 발견했다.써드 파티 애플리케이션 올바르게 완료되지 ZLIB 스트림 생성된다

78 9C F2 48 CD C9의 C9 57 08 CF CA 49 51 E4 E5 층 02 00 00 00 FF FF로를

이는 부분 zlib 스트림인데, 은 zlib 헤더와 부분적으로 압축 된 스트림 로 구성됩니다. 두 개의 블록이 있으며 두 블록 중 마지막 블록이 블록이 아닙니다. 두 번째 블록은 비어있는 저장 블록이며 플러시 일 때 마커로 사용됩니다. zlib 디코더는 거기에있는 내용을 올바르게 디코딩하고 은 바이트 이후의 데이터를 계속 찾습니다. CA (49) (51) E4 E5 02 00 24 E9 ZLIB 헤더 이루어진 04 55

전체 ZLIB 스트림이다

, 하나를 2F

78 9C F3 48 CD C9의 C9 57 08 CF 블록이 마지막 블록으로 표시되고 zlib 예고편입니다. 예고편은 압축되지 않은 데이터의 Adler-32 체크섬입니다.

그래서 CRC가 없거나 압축 해제 코드가 존재하지 않는 데이터를 계속 찾고 있기 때문에 압축 풀기가 실패합니다.