Задать вопрос
@askar_astana

Как проверить целостность ZIP-архива (в частности, файла Office Open XML) программно (на С или С++)?

Добрый день!

Иногда случается так, что часть файла в формате Office Open XML (docx, pptx, xslx) бьётся. Известно, что эти файлы по сути ZIP-архивы (возможно, с особенным алгоритмом сжатия?).

Нужна библиотека (желательно с примером на С/С++), которая может проверить (не распаковать) целостность этого ZIP-архива, то есть проверить контрольную сумму CRC содержимого архива.
  • Вопрос задан
  • 2335 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@askar_astana Автор вопроса
Использовал библиотеку miniz и example2

BOOL isZipCorrect(const char *pFilename) {
	int ci;
	void *p;
	size_t uncomp_size;
	mz_bool status;
	mz_zip_archive zip_archive;

	// open the archive.
	memset(&zip_archive, 0, sizeof(zip_archive));
	status = mz_zip_reader_init_file(&zip_archive, pFilename, 0);
	if (!status) {
		  return FALSE;
	}
	
	// go throw all files
	for (ci = 0; ci < (int)mz_zip_reader_get_num_files(&zip_archive); ci++) {
		// get information about each file in the archive
		mz_zip_archive_file_stat file_stat;
		if (!mz_zip_reader_file_stat(&zip_archive, ci, &file_stat))
		{
			mz_zip_reader_end(&zip_archive);
			return FALSE;
		}

		// try to extract this file
		p = mz_zip_reader_extract_file_to_heap(&zip_archive, file_stat.m_filename, &uncomp_size, 0);
		if (!p)
		{
			mz_zip_reader_end(&zip_archive);
			return FALSE;
		}
		
		// we're done.
		mz_free(p);
	}

	// close the archive, freeing any resources it was using
	mz_zip_reader_end(&zip_archive);

	// return ok state
	return TRUE;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
maaGames
@maaGames
Погроммирую программы
По идее, если это переименованный zip файл, то подойдёт любой консольный архиватор, у которого есть команда "проверить целостность архива".
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
файлы по сути ZIP-архивы

Deflate — это алгоритм сжатия без потерь, использующий комбинацию алгоритмов LZ77 и Хаффмана. Изначально был описан Филом Кацем для второй версии его архиватора PKZIP, который впоследствии был определён в RFC 1951 (1996 год).

Вряд ли там какой-то 7z для сжатия, потому что им лицензию на него никто бы не дал.

Deflate считается свободным от всех существующих патентов

google
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы