0

こんにちは、私は基本的に zlib ライブラリを使用しようとしていますが、自己収縮ファイルを膨張させようとすると問題が発生しますが、他の zlib'd ファイルを膨張させると正常に動作します。

圧縮コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned char BYTE;
typedef unsigned int  UINT; 
#include "zlib.h"
#define HEADERSIZE (1024)
#define CHUNKSIZE 4096
#define SWAPINT(x) (((x)&0xFF) << 24)|(((x)&0xFF00) << 8) | (((x)&0xFF0000) >> 8) | (((x)&0xFF000000) >> 24)
#define DEFLATESIZE 65536
const char *mz_error(int err)
{
  static struct { int m_err; const char *m_pDesc; } s_error_descs[] =
  {
    { Z_OK, "" }, { Z_STREAM_END, "stream end" }, { Z_NEED_DICT, "need dictionary" }, { Z_ERRNO, "file error" }, { Z_STREAM_ERROR, "stream error" },
    { Z_DATA_ERROR, "data error" }, { Z_MEM_ERROR, "out of memory" }, { Z_BUF_ERROR, "buf error" }, { Z_VERSION_ERROR, "version error" }
  };
  UINT i; for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc;
  return NULL;
}

char* myinflate(char* buffer, int bufsize, int* inflatedSize)
{
    BYTE tmpinf[DEFLATESIZE];
    char* inflated=(char*)malloc(DEFLATESIZE);
    int ret,have;
    z_stream strm;
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    strm.avail_in = bufsize;
    strm.next_in = (Bytef*)buffer;
    strm.avail_out = sizeof(tmpinf);
    strm.next_out = tmpinf;
    ret = inflateInit(&strm);
    printf("%s",mz_error(ret));
    ret = inflate(&strm, Z_FINISH);
    printf("%s",mz_error(ret));
    if(ret == Z_DATA_ERROR)
        printf(strm.msg);
    inflateEnd(&strm);
    have = strm.total_out;
    printf("%d\n",have);
    memcpy(inflated,tmpinf,have);
    *inflatedSize = have;
    return inflated;
}
char* mydeflate(char* buffer, int bufsize, int* deflatedSize)
{
    BYTE tmpdef[CHUNKSIZE*4];
    char* deflated=(char*)malloc(DEFLATESIZE);
    int have,ret;
    z_stream strm;
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    strm.avail_in = bufsize;
    strm.next_in = (Bytef*)buffer;
    strm.avail_out = sizeof(tmpdef);
    strm.next_out = tmpdef;
    ret = deflateInit(&strm,Z_DEFAULT_COMPRESSION);
    printf("%s",mz_error(ret));
    ret = deflate(&strm, Z_FINISH);
    printf("%s",mz_error(ret));
    ret = deflateEnd(&strm);
    printf("%s",mz_error(ret));
    have = strm.total_out;
    printf("%d\n",have);
    memcpy(deflated,tmpdef,have);
    *deflatedSize = have;
    return deflated;
}
int main()
{
    FILE* fptr = fopen("test.in","rb");
    fseek (fptr, 0, SEEK_END);
    int size  = ftell(fptr);
    fseek (fptr, 0, SEEK_SET);
    char* buffer = (char*)malloc(size);
    fread(buffer,1,size,fptr);
    int infsize,defsize;
    char* buf = myinflate(buffer,size,&infsize);
    FILE* out = fopen("testinf.hex","wb");
    fwrite(buf,1,infsize,out);
    fclose(out);
    char* buf2 = mydeflate(buf,infsize,&defsize);
    out  = fopen("testdef.hex","wb");
    fwrite(buf2,1,defsize,out);
    fclose(out);
    int buf3size;
    char* buf3 = myinflate(buf2,defsize,&buf3size);
    out  = fopen("testinfdef.hex","wb");
    fwrite(buf3,1,buf3size,out);
}

http://www.filehosting.org/file/details/364574/eEyzAbMuCp93MmGk/test.in

4

2 に答える 2

5

リターンコードをチェックていません。何が起こっているのかを知っているとどうして期待できますか? エラーを返す可能性のあるすべての関数からのリターン コードを確認してください。

圧縮および/または解凍に十分なスペースが提供されていない可能性があります。inflate()およびからの戻りコードcompress()は、そうであるかどうかを示します。

ちなみに、malloc() inflated最初のものを2回上書きすると、大量のメモリリークが発生します。

また、int ポインターを unsigned long ポインターに気軽に変換します。長さが異なると、問題が発生します。

于 2012-08-04T00:52:58.883 に答える
0

実際には、 http://www.winimage.com/zLibDll/zlib125dll.zipで動作するように ZLIB_WINAPI を定義する必要がありました。今それは動作します

于 2012-08-05T21:43:24.137 に答える