Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C zlib压缩和解压缩用法_C_Zlib_Compression - Fatal编程技术网

C zlib压缩和解压缩用法

C zlib压缩和解压缩用法,c,zlib,compression,C,Zlib,Compression,我正在尝试使用compress()和uncompress()函数用zlib压缩和解压随机生成的字符串的最简单方法。但是在执行uncompress()函数之后,我得到了一个Z_DATA_错误(-3)。有人知道我的错误在哪里吗 代码如下: int main(int argc __attribute ((unused)),char **argv __attribute ((unused))) { unsigned char* cara_in; unsigned char* cara_i

我正在尝试使用
compress()
uncompress()
函数用zlib压缩和解压随机生成的字符串的最简单方法。但是在执行
uncompress()
函数之后,我得到了一个
Z_DATA_错误(-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;
}
int
main(int-argc\uu属性((未使用)),char**argv\uu属性((未使用)))
{
未签名字符*cara_in;
未签名字符*cara_inter;
未签名字符*cara_out;
尺寸i;
大小\u t len=1024*50;//50千字节
int ret;
cara_in=(无符号字符*)malloc(sizeof(无符号字符*)*len);
cara_inter=(无符号字符*)malloc(sizeof(无符号字符*)*len);
cara_out=(无符号字符*)malloc(sizeof(无符号字符*)*len);
uLongf size_cara_inter;
uLongf尺寸为0.5克拉;
srand(时间(空));
/*产生*/
对于(i=0;i
多亏了Francis,下面是正确的源代码:

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;
}
int
main(int-argc\uu属性((未使用)),char**argv\uu属性((未使用)))
{
未签名字符*cara_in;
未签名字符*cara_inter;
未签名字符*cara_out;
尺寸i;
大小\u t len=1024*50;//50千字节
int ret;
cara_in=(无符号字符*)malloc(sizeof(无符号字符*)*len);
cara_inter=(无符号字符*)malloc(sizeof(无符号字符*)*len);
cara_out=(无符号字符*)malloc(sizeof(无符号字符*)*len);
uLongf size_cara_inter;
uLongf尺寸为0.5克拉;
srand(时间(空));
/*产生*/
对于(i=0;i
多亏了Francis,下面是正确的源代码:

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;
}
int
main(int-argc\uu属性((未使用)),char**argv\uu属性((未使用)))
{
未签名字符*cara_in;
未签名字符*cara_inter;
未签名字符*cara_out;
尺寸i;
大小\u t len=1024*50;//50千字节
int ret;
cara_in=(无符号字符*)malloc(sizeof(无符号字符*)*len);
cara_inter=(无符号字符*)malloc(sizeof(无符号字符*)*len);
cara_out=(无符号字符*)malloc(sizeof(无符号字符*)*len);
uLongf size_cara_inter;
uLongf尺寸为0.5克拉;
srand(时间(空));
/*产生*/
对于(i=0;i
编译器是否不知何故没有告诉您
compress()和
decompress()中的参数类型不匹配
calls?在这种情况下,将警告级别调高。如果它告诉您,那么您不认为编译警告可能与运行时故障有关吗?是的,我已经更正了警告,但仍然存在