【问题标题】:zlib compress and uncompress usagezlib 压缩和解压缩用法
【发布时间】:2017-01-12 16:17:36
【问题描述】:

我正在尝试使用compress()uncompress() 函数以最简单的方式使用zlib 压缩和解压缩随机生成的字符串。但在执行uncompress() 函数后,我得到一个Z_DATA_ERROR (-3)。有人知道我的错误在哪里吗?

代码如下:

int
main(int argc __attribute ((unused)),char **argv __attribute ((unused)))
{
    unsigned char* cara_in;
    unsigned char* cara_inter;
    unsigned char* cara_out; 

    size_t i;
    size_t len = 1024*50; //50 KBytes
    int ret;

    cara_in = (unsigned char*)malloc(sizeof(unsigned char*)*len);
    cara_inter = (unsigned char*)malloc(sizeof(unsigned char*)*len);
    cara_out = (unsigned char*)malloc(sizeof(unsigned char*)*len);

    uLongf size_cara_inter;
    uLongf size_cara_out;

    srand(time (NULL));

    /* Generating */
    for(i=0; i < len-1;i++)
    {
        cara_in[i] = (int)(rand() %24 +65);
    }

    size_cara_inter = 2*len;

    ret = compress(
                cara_inter,
                &size_cara_inter,
                cara_in,
                (uLongf)strlen((const char*)cara_in)
                );
    if(ret != Z_OK)
    {
        /* error */
        return EXIT_FAILURE;
    }

    size_cara_out = 2*len;

    ret = uncompress(
                cara_out,
                &size_cara_out,
                cara_inter,
                (uLongf)strlen((const char*)cara_inter)
                );
    if(ret != Z_OK)
    {
        /* error */
        return EXIT_FAILURE;
    }

    /* compare */
    ret = strcmp((const char*)cara_in, (const char*)cara_out);
    if(ret != 0){
        /*problem*/
        fprintf(stderr, "\nOuups! :(\nResult of cmp is %d", ret);
        fflush(stderr);

        fprintf(
                    stderr,
                    "\ncara_in length : %d, cara_out length : %d\n",
                    (unsigned)strlen((const char*)cara_in), (unsigned)strlen((const char*)cara_out)
                    );
        fflush(stderr);
    }

    return EXIT_SUCCESS;
}

【问题讨论】:

  • 您的编译器是否以某种方式没有告诉您compress()decompress() 调用中的参数类型不匹配?在这种情况下,请调高警告级别。如果它告诉你,那么你不认为编译警告可能与运行时失败有关吗?
  • 哎呀,是的!我已经更正了警告,但它仍然无法正常工作......
  • 欢迎来到 Stackoverflow Gaston Lagaffe!失败的一个潜在原因是分配了空终止字符,但从未设置为 0。所以strlen(cara_in) 是未定义的行为。这在法语中被称为“失态”......
  • 好吧,只有法国人才能猜到这幅画是加斯顿·拉加菲……:)
  • 是的,它正在工作!如此简单....谢谢!

标签: c zlib compression


【解决方案1】:

感谢弗朗西斯,这是更正后的源代码:

int
main(int argc __attribute ((unused)),char **argv __attribute ((unused)))
{
    unsigned char* cara_in;
    unsigned char* cara_inter;
    unsigned char* cara_out; 

    size_t i;
    size_t len = 1024*50; //50 KBytes
    int ret;

    cara_in = (unsigned char*)malloc(sizeof(unsigned char*)*len);
    cara_inter = (unsigned char*)malloc(sizeof(unsigned char*)*len);
    cara_out = (unsigned char*)malloc(sizeof(unsigned char*)*len);

    uLongf size_cara_inter;
    uLongf size_cara_out;

    srand(time (NULL));

    /* Generating */
    for(i=0; i < len-1;i++)
    {
        cara_in[i] = (int)(rand() %24 +65);
    }

    cara_in[len] = '\0';

    size_cara_inter = 2*len;

    ret = compress(
                cara_inter,
                &size_cara_inter,
                cara_in,
                (uLongf)strlen((const char*)cara_in)
                );
    if(ret != Z_OK)
    {
        /* error */
        return EXIT_FAILURE;
    }

    size_cara_out = 2*len;

    ret = uncompress(
                cara_out,
                &size_cara_out,
                cara_inter,
                size_cara_inter
                );
    if(ret != Z_OK)
    {
        /* error */
        return EXIT_FAILURE;
    }

    /* compare */
    ret = strcmp((const char*)cara_in, (const char*)cara_out);
    if(ret != 0){
        /*problem*/
        fprintf(stderr, "\nOuups! :(\nResult of cmp is %d", ret);
        fflush(stderr);

        fprintf(
                    stderr,
                    "\ncara_in length : %d, cara_out length : %d\n",
                    (unsigned)strlen((const char*)cara_in), (unsigned)strlen((const char*)cara_out)
                    );
        fflush(stderr);
    }

    return EXIT_SUCCESS;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多