12

2 つの暗号化された「.txt」ファイルを含む archive.zip があります。これらの 2 つのファイルを取得するために、アーカイブを解凍したいと思います。

これまでに行ったことは次のとおりです。

FILE *FileIn = fopen("./archive.zip", "rb");
if (FileIn)
    printf("file opened\n");
else
    printf("unable to open file\n");

fseek(FileIn, 0, SEEK_END);
unsigned long FileInSize = ftell(FileIn);
printf("size of input compressed file : %u\n", FileInSize);

void *CompDataBuff = malloc(FileInSize);
void *UnCompDataBuff = NULL;

int fd = open ("archive.zip", O_RDONLY);
CompDataBuff = mmap(NULL, FileInSize, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
printf("buffer read : %s\n", (char *)CompDataBuff);

uLongf UnCompSize = (FileInSize * 11/10 + 12);
UnCompDataBuff = malloc(UnCompSize);

int ret_uncp ;

ret_uncp = uncompress((Bytef*)UnCompDataBuff, &UnCompSize, (const Bytef*)CompDataBuff,FileInSize);
printf("size of uncompressed data : %u\n", UnCompSize);

if (ret_uncp == Z_OK){
    printf("uncompression ok\n");
    printf("uncompressed data : %s\n",(char *)UnCompDataBuff);
    }
if (ret_uncp == Z_MEM_ERROR)
    printf("uncompression memory error\n");
if (ret_uncp == Z_BUF_ERROR)
    printf("uncompression buffer error\n");
if (ret_uncp == Z_DATA_ERROR)
    printf("uncompression data error\n");

いつも「解凍データエラー」が発生しますが、その理由がわかりません。そして、データを圧縮せずに 2 つのファイルを取得する方法を知りたいです。

4

3 に答える 3

20

zip は、一連のファイルとディレクトリを表すために、圧縮されたデータ ストリームの周りにヘッダーとトレーラー情報をラップするファイル形式です。圧縮されたデータ ストリームは、ほとんどの場合deflate データ ストリームであり、実際には zlib によって生成およびデコードできます。zlib はcrc32、zip ラッパー情報の crc 値を生成およびチェックするために使用できる関数も提供します。

zlib が単独で実行しないのは、zip 構造のデコードと分解です。仕様を使用して独自のコードを作成するか(それほど難しくありません)、zlib ディストリビューションのcontrib/minizip ディレクトリにある minizip ルーチンを使用して、zip を開き、アクセスし、閉じる機能を提供することができます。ファイル。

于 2012-07-23T23:29:40.607 に答える
10

Zlibは、.zipファイルを処理するためのライブラリではありません。.zipのような「アーカイブ」形式ではなく、データの単一ストリームのレベルで機能するzlibおよびgzipストリームの解凍をサポートします。

.zipアーカイブを開いて操作するには、別のライブラリ(たとえば、libzip ;他にも多数あります)が必要になります。

于 2012-07-23T12:20:56.157 に答える
3

前述のように、zlib は圧縮のみを処理し、アーカイブは処理しません。圧縮または解凍したい場合は、たまたまzip形式のアーカイブからファイルを抽出することです(rar、7zipなどの他の形式があります)

zip を作成したり、ファイルを解凍したりする場合は、zip 形式を処理する必要があります。minizip は優れたライブラリであり、堅牢であり、かなり長い間使用されています。

minizip https://github.com/nmoinvaz/minizipの使用方法の例が記載された contrib があります。それほど難しいことではありません。minizip.c と miniunz.c で使用方法のコードを確認できます。(Minizip は圧縮に zlib を使用します)

また、minizip をラップし、多くの優れた機能を追加して、使いやすくオブジェクト指向にするライブラリを構築することになりました。フォルダー全体、ストリーム、ベクターなどを zip するなどの操作を実行できます。また、すべてを完全にメモリ内で実行することもできます。

ここに例を含むレポ: https://github.com/sebastiandev/zipper

ベータプレリリース: https://github.com/sebastiandev/zipper/releases/

コードは次のようになります。

Zipper zipper("ziptest.zip");
zipper.add("somefile.txt");
zipper.add("myFolder");
zipper.close();
于 2015-07-26T18:49:58.073 に答える