Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Pytanie] dekompresja zip c++


Rekomendowane odpowiedzi

Opublikowano

Witam

Chce się nauczyć wypakowywać pliki z archiwum zip. Zrobiłem funkcje która rozbija cały plik na nagłówek i ciało zarchiwizowanych plików. Jest skompresowany metodą deflate. Użyłem biblioteki zlib aby odczytać to, lecz dostaje ciągle błąd danych. Jeśli znajdziecie błąd proszę o pomoc. Poniżej umieszczam kod funkcji dekompresującej.

string decompress(file_zip a){
    //a.date_compress to jest ciało pliku
    unsigned char * bufor = new unsigned char[a.date_compress.size()];
    for(unsigned int i=0;i<a.date_compress.size();i++){
        bufor[i]=a.date_compress.c_str()[i];
    }
    unsigned char* uncompressed_buffer;
    size_t uncompressed_buffer_size;
	const void *compressed_buff;
	char decompress_init;
	z_stream stream;
	char stream_valid;
	int r;
	if (uncompressed_buffer == NULL) {
		uncompressed_buffer_size = 32 * 1024;
		uncompressed_buffer = (unsigned char *)malloc(uncompressed_buffer_size);
		if (uncompressed_buffer == NULL) {
			cout<<"No memory for ZIP decompression"<<endl;
			return "c";
		}
	}
        r = inflateInit2(&stream, -15);
		if (r != Z_OK) {
			cout<<"Can't initialize ZIP decompression."<<endl;
			return "s";
		}
	stream.next_in = (Bytef *)(uintptr_t)(const void *)bufor;
	stream.avail_in = a.date_compress.size();
	stream.total_in = 0;
	stream.next_out = uncompressed_buffer;
	stream.avail_out = uncompressed_buffer_size;
	stream.total_out = 0;
	r = inflate(&stream, 0);
	switch (r) {
        case Z_OK:
            break;
        case Z_STREAM_END:
            break;
        case Z_MEM_ERROR:
            cout<<"Out of memory for ZIP decompression"<<endl;
            break;
        default:
            cout<<"ZIP decompression failed ("<<r<<")"<<endl;
            break;
	}
	return "d";
}

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...