2011-02-17 2 views
1

파이썬과 zlib을 사용하여 버퍼를 압축합니다.이를 C++ 프로그램에서 압축을 풉니 다.zlib uncompress는 Ubuntu 10.10 x64에서 -5를 반환합니다. (g ++ -m64)

g ++ -m32로 프로그램을 빌드하면 버퍼를 압축 해제 할 수 있습니다.

g ++ -m64로 빌드하고 (동일한 옵션으로 링크하는 경우) -5 (Z_BUF_ERROR)를 리턴합니다.

해결할 수 있습니까? 버퍼의 크기를 변경해야합니까?

정확한 크기로 출력 버퍼를 할당하려면 64 비트 또는 그와 비슷한 크기로 정렬해야합니까?

감사합니다.

답변

2

최근에 이런 종류의 문제가 발생했습니다. 비록 64 비트 시스템에서 실행 되더라도 32 비트로 컴파일 될 때 소프트웨어가 잘 돌아 갔지만 64 비트 환경에서 컴파일 할 때 uncompress()에서 동일한 Z_BUF_ERROR를 반환합니다 (-m64 사용)

압축 된 데이터를주의 깊게 확인했습니다 : 소프트웨어에 의해 압축 된 파일에서 읽은 다음 다시 파일에 덤핑하고 비교합니다. 차이는 없습니다.

그래서 내 결론은 zlib 자체에서 오는 문제였습니다. 우분투 10.4 리포지토리는 zlib 버전 1.2.3 만 제공합니다. zlib 홈 페이지는 버전 1.2.5를 제공합니다 (더 나은 이식성에 대한 몇 가지주의 사항이 있음).

희망이 있습니다.

편집 : uncompress()를 사용하여 inflate()로 이동했으며 64 비트 아키텍처에서 문제가 해결되었습니다. 따라서 zlib의 최신 버전 (> 1.2.3)을 사용하는 64 비트 시스템에서 uncompress()가 작동하는지 아직 알 수 없습니다. 하지만이 해결 방법은 zlib-1.2.3/64bits를 사용하면 괜찮습니다.

1

나는 동일한 문제가있었습니다. 왜냐하면 내가 int에 대한 참조를 uncompress (destLen)의 두 번째 매개 변수로 전달했기 때문입니다. 이로 인해 uLong (4 대신 8 바이트)으로 확장되었으므로 압축 해제 함수에서 잘못된 값이 발생했습니다. destLen 매개 변수에 uLong 변수 참조를 사용하면 모든 문제가 해결됩니다.

+0

위대한 답변! 완벽하게 작동합니다. 나는 이것을 며칠 동안 갇혔습니다. –