2017-03-07 55 views
2

我正在使用zlib 1.2.11。當我使用偏移量大於有符號整數範圍的gzseek(2^32的一半)時;我得到bytes_read爲-1。有沒有辦法使用64位偏移量。當偏移量太大(大於signed int 2^32的範圍)時,gzseek(zlib)失敗?

這裏是gzseek64的定義中摘錄gzlib.c


if (state->mode == GZ_READ) { 
     n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ?(unsigned)offset : state->x.have; 
     state->x.have -= n; 
     state->x.next += n; 
     state->x.pos += n; 
     offset -= n; 
    } 

這裏n是無符號整數,可容納只有32位......即使我的偏移爲64位如何保持該值....請糾正我,如果我錯了

更多發現: 聲明宏後Z_LARGE64 ... gzseek接受64位偏移量,但... 當我通過一個大的偏移seeked返回的字節是大的負價值,我認爲它與__int64做unsigned int類型轉換

+0

關於什麼? Linux呢?視窗?蘋果系統?它是如何編譯的? –

+0

我正在使用Windows。我知道有一些方法可以將gzseek調用鏈接到gzseek64,只有在32位DLL中才有這種方法?因爲當我嘗試構建zlib 1.2.11時,DLL中沒有gzseek64函數(或者依賴walker說)。 –

+0

_LARGEFILE64_SOURCE已定義,但gzseek64仍未導出,我錯過了一些東西 –

回答

0

編譯庫Z_LARGE64,然後使用該LIB建設你的申請。在#include "zlib.h"之前的應用包括Z_LARGE64。然後用gzseek64()

+0

我試着用Z_LARGE64編譯庫,但庫或DLL內置的不具有** gzseek64 **導出。我使用Dependency Walker證實了這一點因此,當我嘗試編譯我的應用程序時,我得到鏈接器錯誤。 –

相關問題