2017-05-22 3 views
1

Ich habe einen Vektor (der nur ein Wrapper über ein Char-Array ist), der die Eingabe ist. Das PKZIP wurde mit C# sharpZipLib erstellt.Verwenden von Minizip zum Dekomprimieren eines Char-Arrays

Ich speicherte die Daten in eine Datei, die ich durchlief eine Hex-Editor-Zip-Vorlage, die ausgecheckt. Die Eingabe ist gut, es ist nicht fehlerhaft. Das alles aber die komprimierten Daten:

50 4B 03 04 14 00 00 00 08 00 51 B2 8B 4A B3 B6 
6C B0 F6 18 00 00 40 07 01 00 07 00 00 00 2D 33 
31 2F 31 32 38 

<compressed data (6390 bytes)> 

50 4B 01 02 14 00 14 00 00 00 08 00 51 B2 8B 4A 
B3 B6 6C B0 F6 18 00 00 40 07 01 00 07 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 2D 33 
31 2F 31 32 38 50 4B 05 06 00 00 00 00 01 00 01 
00 35 00 00 00 1B 19 00 00 00 00 

Ich habe einen anderen Vektor, der die Ausgabe sein soll. Die aufgeblähten Daten haben ungefähr 67-68k, also weiß ich, dass es in den Puffer passt.

Für das Leben von mir, kann ich nicht das Minizip bekommen, um das erstere aufzublasen und es in letzterem zu speichern. Diese

ist das, was ich bisher:

#include "minizip\zlib.h" 

#define ZLIB_WINAPI 

std::vector<unsigned char> data; 

/*...*/ 

std::vector<unsigned char> outBuffer(1024 * 1024); 

z_stream stream; 

stream.zalloc = Z_NULL; 
stream.zfree = Z_NULL; 
stream.opaque = Z_NULL; 

stream.data_type = Z_BINARY; 

stream.avail_in = data.size(); 
stream.avail_out = outBuffer.size(); 

stream.next_in = &data[0]; 
stream.next_out = &outBuffer[0]; 

int ret = inflateInit(&stream); 
ret = inflate(&stream, 1); 
ret = inflateEnd(&stream); 

ich den Debugger verwendet, um durch das Verfahren zu Schritt und die ret zu überwachen. inflate Rückgabewert -3 mit Nachricht "incorrect header check".

Dies ist ein pkzip, die ein Wrapper um zlib, aber minizip sollte eine Wrapper-Bibliothek um zlib sein, die pkzip unterstützen sollte, sollte es nicht sein? Wie muss ich dies ändern, um zu arbeiten?

+1

Was ist der Sinn der Rückgabe von 'nullptr'? Sie ändern "Daten" nicht, da sie nach Wert übergeben werden, so dass Ihre Funktion im Grunde nichts tut. – ForceBru

+0

Ich versuche es zu testen, ich habe nullptr als Halter benutzt. Ich wollte bestätigen, dass das Aufblasen über VS-Watcher funktioniert, bevor ich den Rest der Methode implementiere. EDIT: Es wurde behoben, so dass es Sinn macht. – Karlovsky120

+0

Warum bin ich offtopic? – Karlovsky120

Antwort

0

Zip-Utils

std::vector<unsigned char> inputBuffer; 
std::vector<unsigned char> outBuffer(1024 * 1024); 

HZIP hz = OpenZip(&inputBuffer[0], inputBuffer.capacity(), 0); 
ZIPENTRY ze; 
GetZipItem(hz, 0, &ze); 
UnzipItem(hz, 0, &outBuffer[0], 1024 * 1024); 

outBuffer.resize(ze.unc_size); 

Wenn inputBuffer eine pkzip Datei enthält, das Snippet entpacken und speichern Inhalte in outBuffer.

Das ist alles.

2

Da es sich bei 50 4B 03 04 beginnt, ist es eine PKZIP-Datei, nach

Wenn diese Zip-Dateien, dann aufzublasen ist die falsche Funktion. Die Formate zlib, gzip und zip unterscheiden sich alle. Sie können zip mit zlib lesen, wenn Sie dazu die richtigen Funktionen verwenden. Wenn Sie den Contrib nicht haben, können Sie zlib herunterladen und neu erstellen.

Hier ist ein alter Code, den ich habe, der für zip-Dateien funktioniert, mit der zlib-Bibliothek. Ich könnte einige Header verschoben haben, weil die offizielle zlib sie unter zlib/contrib/minizip hat.

Die Argumente sind Dateinamen, Sie müssen sie also ändern oder Ihr Array in eine Datei schreiben.

// #include <zlib/unzip.h> 
#include <zlib/contrib/minizip/unzip.h> 

/// return list of filenames in zip archive 
std::list<std::string> GetZipFilenames(const char *szZipArchive){ 
    std::list<std::string> results; 
    unzFile zip = unzOpen(szZipArchive); 
    if (zip){ 
     unz_global_info info; 
     int rv = unzGetGlobalInfo(zip, &info); 

     if (UNZ_OK == unzGoToFirstFile(zip)){ 
      do { 
       char szFilename[BUFSIZ]; 
       if (UNZ_OK == unzGetCurrentFileInfo(zip, NULL, szFilename, sizeof(szFilename), NULL, 0, NULL, 0)) 
        results.push_back(std::string(szFilename)); 
      } while (UNZ_OK == unzGoToNextFile(zip)); 
     } 
    } 
    return results; 
} 

/// extract the contents of szFilename inside szZipArchive 
bool ExtractZipFileContents(const char *szZipArchive, const char *szFilename, std::string &contents){ 
    bool result = false; 
    unzFile zip = unzOpen(szZipArchive); 
    if (zip){ 
     if (UNZ_OK == unzLocateFile(zip, szFilename, 0)){ 
      if (UNZ_OK == unzOpenCurrentFile(zip)){ 
       char buffer[BUFSIZ]; 
       size_t bytes; 
       while (0 < (bytes = unzReadCurrentFile(zip, buffer, sizeof(buffer)))){ 
        contents += std::string(buffer, bytes); 
       } 
       unzCloseCurrentFile(zip); 
       result = (bytes == 0); 
      } 
     } 
     unzClose(zip); 
    } 
    return result; 
} 
+0

Danke für die Mühe und ertragen mit mir. – Karlovsky120

1

Wenn ich die Frage richtig verstehe, versuchen Sie, die 6390 Bytes komprimierter Daten zu dekomprimieren. Diese komprimierten Daten sind ein roher Deflate-Stream, der keinen zlib-Header oder -Trailer hat. Dafür müssten Sie inflateInit2(&stream, -15) statt inflateInit(&stream) verwenden. Die -15 fordert Dekomprimierung von Roh-Deflate.

Verwandte Themen