다른 응용 프로그램으로 압축 된 데이터의 압축을 풀어야하는 응용 프로그램을 작성하고 있습니다.이 파일은 내 제어 밖에 있으며 소스 코드를 변경할 수 없습니다. 제작자 응용 프로그램은 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
의 반환 코드와 함께 손상된 데이터를 나타냅니다.
내가 z_stream 방법으로 압축 된 데이터를 압축 해제 기능을 ZLIB "압축 해제"를 사용할 수 있어야합니다 :
나는 몇 가지 질문이?위 예제에서 마지막 4 바이트의 의미는 무엇입니까? 외부 적으로 압축 된 데이터 스트림과 내 테스트 데이터 스트림이 동일한 길이라면, 마지막 4 바이트는 무엇을 나타내는가?
건배 zlib의 저자에
나는 이것에 대해 아무런 단서가 없지만 질문에 추가하지 않은 정보 중 잠재적으로 관련이있는 부분은 zlib 압축 해제가 정확히 어떻게 실패하는지입니다. –
감사합니다. – Thomi