使用zlib的使用zpipe.c例如创建一个gzip文件 [英] Using zlib to create a gzip file using zpipe.c example

查看:179
本文介绍了使用zlib的使用zpipe.c例如创建一个gzip文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所有,

我只是试图让zpipe演示使用DEV-C ++,我有所有的zlib的code导入,使用zpipe.c作为一个例子工作。一切编译和运行。如果我试图创建一个使用注释掉调用deflateInit2它现在的错误造成的,但7zip的解压时损坏的gzip文件。如果我使用标准zlib的头文件来创建文件,当我使用相应的调用它充气给我-3 / Z_DATA_ERROR表明损坏我defalte数据回报。一切都指向一些自己的错误在DEF结,但它的pretty准确得多的例子。

任何想法?在此先感谢这么多!

  INT主(INT ARGC,字符** argv的)
{
     INT RET;
     FILE *源;
     FILE *拉链;
     FILE *压缩;
     FILE *备用;     来源= FOPEN(C:\\\\ \\\\用户\\\\ schmoudm \\\\图片caela.jpg,R);
     邮编= FOPEN(C:\\\\ \\\\核心RD \\\\ test.gz,W);     的printf(调用高清\\ n);
     RET = DEF(源,ZIP,Z_DEFAULT_COM preSSION);
     的printf(DEF返回:%I \\ N,RET);
     FCLOSE(源);
     FCLOSE(ZIP);     如果(RET == 0){
        输出(设置INF \\ n);
        压缩= FOPEN(C:\\\\ \\\\核心RD \\\\ test.gz,R);
        回到= FOPEN(C:\\\\ \\\\核心RD \\\\ zlibout.txt,W);
        的printf(调用INF \\ n);
        RET = INF(压缩,后);
        的printf(INF回报:%I \\ N,RET);
        ZERR(RET);
     }    FCLOSE(源);
    FCLOSE(ZIP);    的printf(DONE!);
    系统(暂停);
    返回0;
}诠释高清(FILE *源,FILE * DEST,INT级)
{
    INT RET,冲洗;
    符号有;
    z_stream STRM;
    在[CHUNK] unsigned char型;
    unsigned char型出[CHUNK]    / *分配放气状态* /
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;    RET = deflateInit(安培; STRM,Z_DEFAULT_COM preSSION);
    // RET = deflateInit2(安培; STRM,Z_DEFAULT_COM preSSION,Z_DEFLATED,(15 + 16),8,Z_DEFAULT_STRATEGY);
    如果(RET!= Z_OK)
        返回RET;    / * COM preSS直到文件结束* /
    做{
        strm.avail_in = FREAD(IN,1,块,源);
        的printf(版本:%U \\ N,strm.avail_in);
        如果(FERROR(源)){
            (无效)deflateEnd(安培; STRM);
            返回Z_ERRNO;
        }
        冲水=的feof(源)? Z_FINISH:Z_NO_FLUSH;
        strm.next_in =中;        / *运行放气()输入到输出缓冲区未满,光洁度
           COM pression如果所有的源已在*被读取/
        做{
            strm.avail_out = CHUNK;
            strm.next_out =出来;
            RET =放气(放; STRM,平齐); / *没有不好的返回值* /
            断言(RET = Z_STREAM_ERROR!); / *状态不是重挫* /
            有= CHUNK - strm.avail_out;
            如果(FWRITE(出,1,有,DEST)!= ||有FERROR(DEST)){
                (无效)deflateEnd(安培; STRM);
                返回Z_ERRNO;
            }
        }而(strm.avail_out == 0);
        断言(strm.avail_in == 0); / *所有的输入将被使用* /        / *当文件最后一个数据处理完成* /
    }而(冲水= Z_FINISH!);
    断言(RET = = Z_STREAM_END); / *流将完成* /    / *清理和恢复* /
    (无效)deflateEnd(安培; STRM);
    返回Z_OK;
}


解决方案

  

但它的pretty准确得多的例子。


唉,你从 zpipe.c

 #如果定义(MSDOS)||定义(OS2)||定义(WIN32)||定义(__ CYGWIN__)
#包括LT&;&fcntl.h GT;
#包括LT&;&io.h GT;
#定义SET_BINARY_MODE(文件)setmode(的fileno(文件),O_BINARY)
#其他
#定义SET_BINARY_MODE(文件)
#万一

  / *避免尾线转换* /
SET_BINARY_MODE(标准输入);
SET_BINARY_MODE(标准输出);

因此​​,在您code你需要做的 SET_BINARY_MODE(来源) SET_BINARY_MODE(ZIP)

或者你需要使用B选项均 fopen()函数

All,

I am just trying to get the zpipe demo working using dev-c++ where I have all the zlib code imported and using the zpipe.c as an example. Everything compiles and runs. If I try to create a gzip file using the commented out call to deflateInit2 it creates with now errors, but is corrupted when unzipping with 7zip. If I use the standard zlib headers to create the file, when I use the corresponding call to inflate it give me a return of -3/Z_DATA_ERROR indicating my defalte data is corrupted. Everything points to something being wrong in the def unction, but its pretty much exactly the example.

Any ideas?? Thanks so much in advance!

int main(int argc, char **argv)
{
     int ret;
     FILE *source;
     FILE *zip;
     FILE *zipped;
     FILE *back;

     source = fopen ("C:\\Users\\schmoudm\\Pictures\\caela.jpg", "r");
     zip = fopen ("C:\\Core\\RD\\test.gz", "w");

     printf ("calling def \n");
     ret = def(source, zip, Z_DEFAULT_COMPRESSION);
     printf("def return: %i \n", ret);
     fclose(source);
     fclose(zip);

     if (ret == 0) {
        printf ("setting up inf \n");
        zipped = fopen ("C:\\Core\\RD\\test.gz", "r"); 
        back = fopen ("C:\\Core\\RD\\zlibout.txt", "w"); 
        printf ("calling inf \n");
        ret = inf(zipped, back); 
        printf("inf return: %i \n", ret);  
        zerr(ret);
     }

    fclose(source);
    fclose(zip);

    printf("DONE!");
    system("PAUSE");
    return 0;
}

int def(FILE *source, FILE *dest, int level)
{
    int ret, flush;
    unsigned have;
    z_stream strm;
    unsigned char in[CHUNK];
    unsigned char out[CHUNK];

    /* allocate deflate state */
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;

    ret = deflateInit(&strm, Z_DEFAULT_COMPRESSION);
    //ret = deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8,       Z_DEFAULT_STRATEGY);
    if (ret != Z_OK)
        return ret;

    /* compress until end of file */
    do {
        strm.avail_in = fread(in, 1, CHUNK, source);
        printf("available in: %u \n", strm.avail_in);  
        if (ferror(source)) {
            (void)deflateEnd(&strm);
            return Z_ERRNO;
        }
        flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
        strm.next_in = in;

        /* run deflate() on input until output buffer not full, finish
           compression if all of source has been read in */
        do {
            strm.avail_out = CHUNK;
            strm.next_out = out;
            ret = deflate(&strm, flush);    /* no bad return value */
            assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
            have = CHUNK - strm.avail_out;
            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
                (void)deflateEnd(&strm);
                return Z_ERRNO;
            }
        } while (strm.avail_out == 0);
        assert(strm.avail_in == 0);     /* all input will be used */

        /* done when last data in file processed */
    } while (flush != Z_FINISH);
    assert(ret == Z_STREAM_END);        /* stream will be complete */

    /* clean up and return */
    (void)deflateEnd(&strm);
    return Z_OK;
}

解决方案

but its pretty much exactly the example.

Alas, you left out a critical portion from zpipe.c.

#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
#  include <fcntl.h>
#  include <io.h>
#  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
#else
#  define SET_BINARY_MODE(file)
#endif

and

/* avoid end-of-line conversions */
SET_BINARY_MODE(stdin);
SET_BINARY_MODE(stdout);

So in your code you need to do SET_BINARY_MODE(source) and SET_BINARY_MODE(zip).

Or you need to use the "b" option in both fopen()'s.

这篇关于使用zlib的使用zpipe.c例如创建一个gzip文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆