Android NDK zlib возвращает Z_DATA_ERROR для действительной информации zip - PullRequest
0 голосов
/ 31 мая 2011

Я делаю следующее, чтобы распаковать блок сжатых данных:

z_stream stream;
int err;

int nExtraChunks;
uInt destlen;

stream.next_in = (Bytef*)pSrc;
stream.avail_in = (uInt)nSrcLen;
destlen = (uInt)*pnDestLen;
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;

err = inflateInit(&stream);
if (err != Z_OK) 
    return err;

nExtraChunks = 0;
do {
    stream.next_out = pDest;
    stream.avail_out = destlen;
    err = inflate(&stream, Z_FINISH);
    if (err == Z_STREAM_END )
        break;
    if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
    {
        err = Z_DATA_ERROR;
    }
    if (err != Z_BUF_ERROR) 
    {
        inflateEnd(&stream);
        return err;
    }
    nExtraChunks += 1;
} while (stream.avail_out == 0);

*pnDestLen = stream.total_out;

err = inflateEnd(&stream);
if (err != Z_OK) return err;

return nExtraChunks ? Z_BUF_ERROR : Z_OK;

, где pSrc и nSrcLen, pDest и destLen - заданные блоки памяти и их соответствующие длины.pSrc содержит содержимое действительного zip-файла.

(Эта подпрограмма адаптирована из функции драйвера easyzlib, но я напрямую использую zlib, предоставляемый NDK.)

При первом вызове инфляции возвращается -3 (Z_DATA_ERROR) для каждого сделанного мной вызова,Я подтвердил, что zip действителен, записав блок памяти на диск, выполнив команду «adb pull», чтобы загрузить ее на мой Mac и распаковать ее.Я не очень хорошо знаю zlib ... что я могу сделать, чтобы отладить это?

1 Ответ

0 голосов
/ 01 июня 2011

Как я уже говорил, я использую Mac для разработки. Я сжимал файлы "zip", что, по-видимому, нет-нет. Это верно, несмотря на то, что и "unzip", и "gunzip" отлично справляются с файлами. Вы должны использовать gzip для получения архива, который может обрабатывать libz Android NDK. Что касается вопроса «Как вы можете отлаживать подобные вещи», у меня все еще нет хорошего ответа, поэтому я застрял, используя свои магические силы, пока не появится что-то лучшее.

...