2017-05-22 6 views
1

私は入力であるベクター(char配列の単なるラッパーです)を持っています。 pkzipは、c#sharpZipLibを使用して作成されました。minizipを使用してchar配列を解凍する

私はチェックアウトした16進エディタのzipテンプレートを使って実行したファイルにデータを保存しました。入力は良いですが、それは不正な形式ではありません。これは、圧縮されたデータを除くすべて:

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 

私は出力する別のベクトルを持っています。膨らんだデータには約67-68kのデータがあるので、バッファに収まることがわかります。

私の人生のために、私は前者を膨らませて後者に保管するためにミニジップを得ることができません。

これは私がこれまで持っているものです。

#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); 

私は方法をステップとretを監視するために、デバッガを使用していました。メッセージ"incorrect header check"inflateに戻り値-3を返します。

これはzlibのラッパーですpkzip、ですが、minizipは、pkzipをサポートする必要がありますzlibのラッパーライブラリである必要があり、それはすべきではありませんか? これを修正するにはどうすればよいですか?

+1

'nullptr'を返すのは何ですか?値によって渡されたときに 'data'を変更しないので、あなたの関数は本質的に何もしません。 – ForceBru

+0

私はそれをテストしようとしています、私はホルダーとしてnullptrを使用しました。私は、メソッドの残りの部分を実装する前に、VSウォッチャーを介してインフレーションの動作を確認したかったのです。編集:それはいくつかの意味があるように修正されました。 – Karlovsky120

+0

なぜ私はofftopicですか? – Karlovsky120

答えて

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); 

inputBufferpkzipファイルが含まれている場合は、このスニペットは、それを解凍し、outBufferの内容を保存します。

これがすべてです。

2

それは50 4B 03 04で始まるので、これらはzipファイルである場合、膨らませることは間違っている機能です

によると、PKZIPファイルです。 zlib、gzip、およびzip形式はすべて異なります。正しい関数を使用すると、zlibでzipを読むことができます。 contribを持っていない場合は、zlibをダウンロードして再構築してください。

zlibライブラリを使用して、zipファイルで動作する古いコードがあります。公式のzlibにはzlib/contrib/minizipの下にあるので、いくつかのヘッダーを移動している可能性があります。

引数はファイル名なので、ファイル名を変更するか、配列をファイルに書き込む必要があります。

// #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

努力してくれてありがとう、ありがとう。 – Karlovsky120

1

私が質問を正しく理解している場合は、6390バイトの圧縮データを解凍しようとしています。圧縮されたデータは、圧縮されていないストリームです。このストリームには、zlibヘッダーやトレーラーがありません。そのためには、inflateInit(&stream)の代わりにinflateInit2(&stream, -15)を使用する必要があります。 -15は、raw deflateの圧縮解除を要求します。

関連する問題