Неправильный EOF при распаковке бинарного файла - PullRequest
0 голосов
/ 31 марта 2010

Я попытался разархивировать двоичный файл на мембрану из zip-архива, используя Zip Utils от Lucian Wischik:

http://www.wischik.com/lu/programmer/zip_utils.html

http://www.codeproject.com/KB/files/zip_utils.aspx

FindZipItem(hz, filename.c_str(), true, &j, &ze);
char *content = new char[ze.unc_size];
UnzipItem(hz, j, content, ze.unc_size);
delete[] content;

Но это не распаковало файл правильно. Он остановился на первом 0x00 файла.

Например, когда я распаковываю файл MP3 внутри ZIP-архива, он распаковывает только первые 4 байта: 0x49443303 (ID3 \ 0), потому что 5–8-й байт равен 0x00.

Я также пытался захватить ZR_RESULT, и он всегда возвращает ZR_OK (что означает, что выполнено без ошибок).

Я думаю, что у этого парня тоже была такая же проблема, но никто не ответил на его вопрос:

http://www.codeproject.com/KB/files/zip_utils.aspx?msg=2876222#xx2876222xx

Любая помощь будет оценена :) 1026 *

Ответы [ 2 ]

1 голос
/ 31 марта 2010

Это может быть просто расстегнуть молнию. Имейте в виду, что многие строково-ориентированные функции display прекратят вывод символов при первом '\0'. Даже ваш отладчик будет отображать char*, как если бы это была строка в вашем окне просмотра. Он может только догадываться, какие данные находятся в массиве символов ... Как вы проверяете, сколько байтов было разархивировано?

Вы можете попробовать что-то вроде этого:

FindZipItem(hz, filename.c_str(), true, &j, &ze);
char *content = new char[ze.unc_size];
memset(content, 0, ze.unc_size); // added so we can say that if it has a bunch of 0 bytes, then the unzip stopped early.
UnzipItem(hz, j, content, ze.unc_size);

// will print in hex all of the bytes in the array
for(int i = 0; i < ze.unc_size; ++i) {
    printf("%02x ", content[i]);
}

delete[] content;
0 голосов
/ 31 марта 2010

У меня есть два ответа.

Во-первых, если вы попытаетесь разархивировать файл MP3. Вы неправы. Файлы MP3 сжимаются, но не в формате zip.

Во-вторых, откуда вы знаете, что библиотека распаковывает только первые 4 байта. Вы пытаетесь printf() содержание? Или strcpy() это? В этом случае поведение нормальное, поскольку эти функции предназначены для обработки текста, который определяется как «все до первого символа».

...